143 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package gountries
 | |
| 
 | |
| import (
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| // Query holds a reference to the QueryHolder struct
 | |
| var queryInited = false
 | |
| var queryInstance *Query
 | |
| 
 | |
| // Query contains queries for countries, cities, etc.
 | |
| type Query struct {
 | |
| 	Countries      map[string]Country
 | |
| 	Subdivisions   map[string][]SubDivision
 | |
| 	NameToAlpha2   map[string]string
 | |
| 	Alpha3ToAlpha2 map[string]string
 | |
| }
 | |
| 
 | |
| // FindCountryByName fincs a country by given name
 | |
| func (q *Query) FindCountryByName(name string) (result Country, err error) {
 | |
| 	lowerName := strings.ToLower(name)
 | |
| 	alpha2, exists := q.NameToAlpha2[lowerName]
 | |
| 	if !exists {
 | |
| 		return Country{}, makeError("Could not find country with name", name)
 | |
| 	}
 | |
| 	return q.Countries[alpha2], nil
 | |
| }
 | |
| 
 | |
| // FindCountryByAlpha fincs a country by given code
 | |
| func (q *Query) FindCountryByAlpha(code string) (result Country, err error) {
 | |
| 	codeU := strings.ToUpper(code)
 | |
| 	switch {
 | |
| 	case len(code) == 2:
 | |
| 		country, exists := q.Countries[codeU]
 | |
| 		if !exists {
 | |
| 			return Country{}, makeError("Could not find country with code %s", code)
 | |
| 		}
 | |
| 		return country, nil
 | |
| 	case len(code) == 3:
 | |
| 		alpha2, exists := q.Alpha3ToAlpha2[codeU]
 | |
| 		if !exists {
 | |
| 			return Country{}, makeError("Could not find country with code", code)
 | |
| 		}
 | |
| 		return q.Countries[alpha2], nil
 | |
| 	default:
 | |
| 		return Country{}, makeError("Invalid code format", code)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // FindAllCountries returns a list of all countries
 | |
| func (q *Query) FindAllCountries() (countries map[string]Country) {
 | |
| 	return q.Countries
 | |
| }
 | |
| 
 | |
| // FindCountries finds a Country based on the given struct data
 | |
| func (q Query) FindCountries(c Country) (countries []Country) {
 | |
| 
 | |
| 	for _, country := range q.Countries {
 | |
| 
 | |
| 		// Name
 | |
| 		//
 | |
| 
 | |
| 		if c.Name.Common != "" && strings.ToLower(c.Name.Common) == strings.ToLower(country.Name.Common) {
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		// Alpha
 | |
| 		//
 | |
| 
 | |
| 		if c.Alpha2 != "" && c.Alpha2 != country.Alpha2 {
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		if c.Alpha3 != "" && c.Alpha3 != country.Alpha3 {
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		// Geo
 | |
| 		//
 | |
| 
 | |
| 		if c.Geo.Continent != "" && strings.ToLower(c.Geo.Continent) != strings.ToLower(country.Geo.Continent) {
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		if c.Geo.Region != "" && strings.ToLower(c.Geo.Region) != strings.ToLower(country.Geo.Region) {
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		if c.Geo.SubRegion != "" && strings.ToLower(c.Geo.SubRegion) != strings.ToLower(country.Geo.SubRegion) {
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		// Misc
 | |
| 		//
 | |
| 
 | |
| 		if c.InternationalPrefix != "" && strings.ToLower(c.InternationalPrefix) != strings.ToLower(country.InternationalPrefix) {
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		// Bordering countries
 | |
| 		//
 | |
| 
 | |
| 		allMatch := false
 | |
| 
 | |
| 		if len(c.BorderingCountries()) > 0 {
 | |
| 
 | |
| 			for _, c1 := range c.BorderingCountries() {
 | |
| 
 | |
| 				match := false
 | |
| 
 | |
| 				for _, c2 := range country.BorderingCountries() {
 | |
| 					match = c1.Alpha2 == c2.Alpha2
 | |
| 
 | |
| 					if match == true {
 | |
| 						break
 | |
| 					}
 | |
| 				}
 | |
| 
 | |
| 				if match == true {
 | |
| 					allMatch = true
 | |
| 				} else {
 | |
| 					allMatch = false
 | |
| 					break
 | |
| 				}
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 			if allMatch == false {
 | |
| 				continue
 | |
| 			}
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 		// Append if all matches
 | |
| 		//
 | |
| 
 | |
| 		countries = append(countries, country)
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	return
 | |
| }
 |