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" may
30	# reflect Canadian conventions, so prefer the "usa" sub-object when present
31
32	# @return [String, nil]
33	def locality
34		usa? ? @data["usa"]["uscity"] : @data["city"]
35	end
36
37	# @return [String, nil]
38	def region
39		usa? ? @data["usa"]["state"] : @data["prov"]
40	end
41
42	# @returh Hash<Symbol, String>
43	def to_h
44		{
45			locality: locality,
46			region: region,
47			country: country
48		}
49	end
50
51private
52
53	# @return [Boolean]
54	def usa?
55		@data.key?("usa")
56	end
57end