github.com/seeker-insurance/kit@v0.0.13/address/fromgoogle.go (about) 1 package address 2 3 import ( 4 "googlemaps.github.io/maps" 5 ) 6 7 type componentType string 8 9 const ( 10 StreetNumber componentType = "street_number" 11 Route componentType = "route" //street 12 Subpremise componentType = "subpremise" //unit number 13 Locality componentType = "locality" //city 14 AdministrativeAreaLevel1 componentType = "administrative_area_level_1" //state 15 PostalCode componentType = "postal_code" //zip 16 Country componentType = "country" 17 ) 18 19 //FromGoogleAddressComponents creates an Addresss from a slice of components, using the AddressCompoment.Types to discriminate. 20 func FromGoogleAddressComponents(addressComponents []maps.AddressComponent, whitelist ...componentType) (address Address) { 21 var street struct{ name, number string } 22 for _, component := range addressComponents { 23 val := component.ShortName 24 for _, label := range component.Types { 25 if !isWhitelisted(whitelist, label) { 26 continue 27 } 28 switch componentType(label) { 29 case StreetNumber: 30 street.number = val 31 case Route: 32 street.name = val 33 case Subpremise: 34 address.Extension = val 35 case Locality: 36 address.Locality = val 37 case AdministrativeAreaLevel1: 38 address.Region = val 39 case Country: 40 address.Country = val 41 case PostalCode: 42 address.PostalCode = val 43 default: //pass 44 } 45 //note: PO box doesn't seem to be handled. 46 } 47 } 48 49 if street.name != "" { 50 if street.number != "" { 51 address.Street = street.number + " " + street.name 52 } else { 53 address.Street = street.name 54 } 55 } 56 57 return address 58 } 59 60 func isWhitelisted(whitelist []componentType, componentLabel string) bool { 61 if len(whitelist) == 0 { 62 return true 63 } 64 65 for _, wl := range whitelist { 66 if string(wl) == componentLabel { 67 return true 68 } 69 } 70 71 return false 72 }