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  }