geo_code.rb

 1# frozen_string_literal: true
 2
 3require "value_semantics/monkey_patched"
 4
 5class GeoCode
 6	def self.for(data)
 7		new(data)
 8	end
 9
10	def initialize(data)
11		@data = data
12	end
13
14	def country
15		return "US" unless @data["postal"]
16		return "US" if @data["postal"] =~ /\A\d+\Z/
17
18		"CA"
19	end
20
21	def sql_point
22		"POINT(#{'%.10f' % @data['longt']} #{'%.10f' % @data['latt']})"
23	end
24
25	def valid?
26		@data["longt"] && @data["latt"]
27	end
28
29	# geocoder.ca is Canadian; for US coordinates the top-level "prov"/"city"
30	# may reflect Canadian conventions, so prefer the "usa" sub-object when present
31
32	# @return [String, nil]
33	def city
34		if @data["usa"]
35			@data["usa"]["uscity"]
36		else
37			@data["city"]
38		end
39	end
40
41	# @return [String, nil]
42	def state
43		if @data["usa"]
44			@data["usa"]["state"]
45		else
46			@data["prov"]
47		end
48	end
49end