250 lines
9.7 KiB
Go
250 lines
9.7 KiB
Go
package vindecoder
|
|
|
|
type rangeSegment struct {
|
|
low byte
|
|
high byte
|
|
country string
|
|
}
|
|
|
|
// source: https://en.wikipedia.org/wiki/Vehicle_identification_number
|
|
//
|
|
// note ascending sort order: A-Z. then 1-9, then 0
|
|
var vinCountryCodeRangeMap = map[byte][]rangeSegment{
|
|
'A': {
|
|
rangeSegment{low: 'A', high: 'H', country: "South Africa"},
|
|
rangeSegment{low: 'J', high: 'K', country: "Cote d'Ivoire"},
|
|
rangeSegment{low: 'L', high: 'L', country: "algeria"},
|
|
rangeSegment{low: 'M', high: 'N', country: "Cote d'Ivoire"},
|
|
// rangeSegment{low: 'P', high: 'P', country: ""},
|
|
rangeSegment{low: 'R', high: 'R', country: "algeria"},
|
|
// rangeSegment{low: 'S', high: 'Z', country: ""},
|
|
// rangeSegment{low: '1', high: '9', country: ""},
|
|
// rangeSegment{low: '0', high: '0', country: ""}
|
|
},
|
|
'B': {
|
|
rangeSegment{low: 'A', high: 'E', country: "SAngola"},
|
|
rangeSegment{low: 'F', high: 'K', country: "Kenya"},
|
|
rangeSegment{low: 'L', high: 'R', country: "Tanzania"},
|
|
// rangeSegment{low: 'S', high: '0', country: ""},
|
|
},
|
|
'C': {
|
|
rangeSegment{low: 'A', high: 'E', country: "Benin"},
|
|
rangeSegment{low: 'F', high: 'K', country: "Madagascar"},
|
|
rangeSegment{low: 'L', high: 'R', country: "Tunisia"},
|
|
// rangeSegment{low: 'S', high: '0", "" },
|
|
},
|
|
'D': {
|
|
rangeSegment{low: 'A', high: 'E', country: "Egypt"},
|
|
rangeSegment{low: 'F', high: 'K', country: "Morocco"},
|
|
rangeSegment{low: 'L', high: 'R', country: "Zambia"},
|
|
// rangeSegment{low: 'S', high: '0', country: ""},
|
|
},
|
|
'E': {
|
|
rangeSegment{low: 'A', high: 'E', country: "Ethiopia"},
|
|
rangeSegment{low: 'F', high: 'K', country: "Mozambique"},
|
|
// rangeSegment{low: 'L', high: '0', country: ""},
|
|
},
|
|
'F': {
|
|
rangeSegment{low: 'A', high: 'E', country: "Ghana"},
|
|
rangeSegment{low: 'F', high: 'K', country: "Nigeria"},
|
|
// rangeSegment{low: 'L', high: '0', country: ""},
|
|
},
|
|
// 'G': {
|
|
// rangeSegment{low: 'A', high: '0', country: ""},
|
|
// },
|
|
// 'H': {
|
|
// rangeSegment{low: 'A', high: '0', country: ""},
|
|
// },
|
|
'J': {
|
|
rangeSegment{low: 'A', high: 'Z', country: "Japan"},
|
|
rangeSegment{low: '1', high: '9', country: "Japan"},
|
|
rangeSegment{low: '0', high: '0', country: "Japan"},
|
|
},
|
|
'K': {
|
|
rangeSegment{low: 'A', high: 'E', country: "Sri Lanka"},
|
|
rangeSegment{low: 'F', high: 'K', country: "Israel"},
|
|
rangeSegment{low: 'L', high: 'R', country: "Korea (South)"},
|
|
rangeSegment{low: 'S', high: 'S', country: "Jordan"},
|
|
rangeSegment{low: 'T', high: 'Z', country: "Kazakhstan"},
|
|
rangeSegment{low: '1', high: '9', country: "Kazakhstan"},
|
|
rangeSegment{low: '0', high: '0', country: "Kazakhstan"},
|
|
},
|
|
'L': {
|
|
rangeSegment{low: 'A', high: 'Z', country: "China"},
|
|
rangeSegment{low: '1', high: '9', country: "China"},
|
|
rangeSegment{low: '0', high: '0', country: "China"},
|
|
},
|
|
'M': {
|
|
rangeSegment{low: 'A', high: 'E', country: "India"},
|
|
rangeSegment{low: 'F', high: 'K', country: "Indonesia"},
|
|
rangeSegment{low: 'L', high: 'R', country: "Thailand"},
|
|
rangeSegment{low: 'S', high: 'Y', country: "Myanmar"},
|
|
rangeSegment{low: 'Z', high: 'Z', country: "India"},
|
|
rangeSegment{low: '1', high: '9', country: "Myanmar"},
|
|
rangeSegment{low: '0', high: '0', country: "Myanmar"},
|
|
},
|
|
'N': {
|
|
rangeSegment{low: 'A', high: 'E', country: "Iran"},
|
|
rangeSegment{low: 'F', high: 'K', country: "Pakistan"},
|
|
rangeSegment{low: 'L', high: 'R', country: "Turkey"},
|
|
// rangeSegment{low: 'S', high: '0', country: "" },
|
|
},
|
|
'P': {
|
|
rangeSegment{low: 'A', high: 'E', country: "Philippines"},
|
|
rangeSegment{low: 'F', high: 'K', country: "Singapore"},
|
|
rangeSegment{low: 'L', high: 'R', country: "Malaysia"},
|
|
// rangeSegment{low: 'S', high: '0', country: "" },
|
|
rangeSegment{low: 'A', high: 'E', country: "United Arab Emirates"},
|
|
rangeSegment{low: 'F', high: 'K', country: "Taiwan"},
|
|
},
|
|
'R': {
|
|
rangeSegment{low: 'L', high: 'R', country: "Vietnam"},
|
|
rangeSegment{low: 'S', high: 'Z', country: "Saudi Arabia"},
|
|
rangeSegment{low: '1', high: '9', country: "Saudi Arabia"},
|
|
rangeSegment{low: '0', high: '0', country: "Saudi Arabia"},
|
|
},
|
|
'S': {
|
|
rangeSegment{low: 'A', high: 'M', country: "United Kingdom"},
|
|
rangeSegment{low: 'N', high: 'T', country: "Germany"},
|
|
rangeSegment{low: 'U', high: 'Z', country: "Poland"},
|
|
rangeSegment{low: '1', high: '4', country: "Latvia"},
|
|
// rangeSegment{low: '5', high: '0', country: "" },
|
|
},
|
|
'T': {
|
|
rangeSegment{low: 'A', high: 'H', country: "Switzerland"},
|
|
rangeSegment{low: 'J', high: 'P', country: "Czech Republic"},
|
|
rangeSegment{low: 'R', high: 'V', country: "Hungary"},
|
|
rangeSegment{low: 'W', high: 'Z', country: "Portugal"},
|
|
rangeSegment{low: '1', high: '1', country: "Portugal"},
|
|
// rangeSegment{low: '2', high: '0', country: "" },
|
|
},
|
|
'U': {
|
|
// rangeSegment{low: 'A', high: 'G', country: "" },
|
|
rangeSegment{low: 'H', high: 'M', country: "Denmark"},
|
|
rangeSegment{low: 'N', high: 'T', country: "Ireland"},
|
|
rangeSegment{low: 'U', high: 'Z', country: "Romania"},
|
|
// rangeSegment{low: '1', high: '4', country: "" },
|
|
rangeSegment{low: '5', high: '7', country: "Slovakia"},
|
|
// rangeSegment{low: '8', high: '0', country: "" },
|
|
},
|
|
'V': {
|
|
rangeSegment{low: 'A', high: 'E', country: "Austria"},
|
|
rangeSegment{low: 'F', high: 'R', country: "France"},
|
|
rangeSegment{low: 'S', high: 'W', country: "Spain"},
|
|
rangeSegment{low: 'X', high: 'Z', country: "Serbia"},
|
|
rangeSegment{low: '1', high: '2', country: "Serbia"},
|
|
rangeSegment{low: '3', high: '5', country: "Croatia"},
|
|
rangeSegment{low: '6', high: '9', country: "Estonia"},
|
|
rangeSegment{low: '0', high: '0', country: "Estonia"},
|
|
},
|
|
'W': {
|
|
rangeSegment{low: 'A', high: 'Z', country: "Germany"},
|
|
rangeSegment{low: '1', high: '9', country: "Germany"},
|
|
rangeSegment{low: '0', high: '0', country: "Germany"},
|
|
},
|
|
'X': {
|
|
rangeSegment{low: 'A', high: 'E', country: "Bulgaria"},
|
|
rangeSegment{low: 'F', high: 'K', country: "Greece"},
|
|
rangeSegment{low: 'L', high: 'R', country: "Netherlands"},
|
|
rangeSegment{low: 'S', high: 'W', country: "Russia"},
|
|
rangeSegment{low: 'X', high: 'Z', country: "Luxembourg"},
|
|
rangeSegment{low: '1', high: '2', country: "Luxembourg"},
|
|
rangeSegment{low: '3', high: '9', country: "Russia"},
|
|
rangeSegment{low: '0', high: '0', country: "Russia"},
|
|
},
|
|
'Y': {
|
|
rangeSegment{low: 'A', high: 'E', country: "Belgium"},
|
|
rangeSegment{low: 'F', high: 'K', country: "Finland"},
|
|
rangeSegment{low: 'L', high: 'R', country: "Malta"},
|
|
rangeSegment{low: 'S', high: 'W', country: "Sweden"},
|
|
rangeSegment{low: 'X', high: 'Z', country: "Norway"},
|
|
rangeSegment{low: '1', high: '2', country: "Norway"},
|
|
rangeSegment{low: '3', high: '5', country: "Belarus"},
|
|
rangeSegment{low: '6', high: '9', country: "Ukraine"},
|
|
rangeSegment{low: '0', high: '0', country: "Ukraine"},
|
|
},
|
|
'Z': {
|
|
rangeSegment{low: 'A', high: 'R', country: "Italy"},
|
|
// rangeSegment{low: 'S', high: 'W', country: "" },
|
|
rangeSegment{low: 'X', high: 'Z', country: "Slovenia"},
|
|
rangeSegment{low: '1', high: '2', country: "Slovenia"},
|
|
rangeSegment{low: '3', high: '5', country: "Lithuania"},
|
|
// rangeSegment{low: '6', high: '0', country: "" },
|
|
},
|
|
'1': {
|
|
rangeSegment{low: 'A', high: 'Z', country: "United States"},
|
|
rangeSegment{low: '1', high: '9', country: "United States"},
|
|
rangeSegment{low: '0', high: '0', country: "United States"},
|
|
},
|
|
'2': {
|
|
rangeSegment{low: 'A', high: 'Z', country: "Canada"},
|
|
rangeSegment{low: '1', high: '9', country: "Canada"},
|
|
rangeSegment{low: '0', high: '0', country: "Canada"},
|
|
},
|
|
'3': {
|
|
rangeSegment{low: 'A', high: 'W', country: "Mexico"},
|
|
rangeSegment{low: 'X', high: 'Z', country: "Costa Rica"},
|
|
rangeSegment{low: '1', high: '7', country: "Costa Rica"},
|
|
rangeSegment{low: '8', high: '9', country: "Cayman Islands"},
|
|
// rangeSegment{low: '0', high: '0', country: "" },
|
|
},
|
|
'4': {
|
|
rangeSegment{low: 'A', high: 'Z', country: "United States"},
|
|
rangeSegment{low: '1', high: '9', country: "United States"},
|
|
rangeSegment{low: '0', high: '0', country: "United States"},
|
|
},
|
|
'5': {
|
|
rangeSegment{low: 'A', high: 'Z', country: "United States"},
|
|
rangeSegment{low: '1', high: '9', country: "United States"},
|
|
rangeSegment{low: '0', high: '0', country: "United States"},
|
|
},
|
|
'6': {
|
|
rangeSegment{low: 'A', high: 'Z', country: "Australia"},
|
|
rangeSegment{low: '1', high: '9', country: "Australia"},
|
|
rangeSegment{low: '0', high: '0', country: "Australia"},
|
|
},
|
|
'7': {
|
|
rangeSegment{low: 'A', high: 'Z', country: "New Zealand"},
|
|
rangeSegment{low: '1', high: '9', country: "New Zealand"},
|
|
rangeSegment{low: '0', high: '0', country: "New Zealand"},
|
|
},
|
|
'8': {
|
|
rangeSegment{low: 'A', high: 'E', country: "Argentina"},
|
|
rangeSegment{low: 'F', high: 'K', country: "Chile"},
|
|
rangeSegment{low: 'L', high: 'R', country: "Ecuador"},
|
|
rangeSegment{low: 'S', high: 'W', country: "Peru"},
|
|
rangeSegment{low: 'X', high: 'Z', country: "Venezuela"},
|
|
rangeSegment{low: '1', high: '2', country: "Venezuela"},
|
|
rangeSegment{low: '2', high: '2', country: "Bolivia"},
|
|
// rangeSegment{low: '3', high: '0', country: "" },
|
|
},
|
|
'9': {
|
|
rangeSegment{low: 'A', high: 'E', country: "Brazil"},
|
|
rangeSegment{low: 'F', high: 'K', country: "Colombia"},
|
|
rangeSegment{low: 'L', high: 'R', country: "Paraguay"},
|
|
rangeSegment{low: 'S', high: 'W', country: "Uruguay"},
|
|
rangeSegment{low: 'X', high: 'Z', country: "Trinidad & Tobago"},
|
|
rangeSegment{low: '1', high: '2', country: "Trinidad & Tobago"},
|
|
rangeSegment{low: '3', high: '9', country: "Brazil"},
|
|
// rangeSegment{low: '0', high: '0', country: "" }
|
|
},
|
|
}
|
|
|
|
func LookupCountry(countryCode string) string {
|
|
var key = countryCode[0]
|
|
var elem = countryCode[1]
|
|
|
|
segments, found := vinCountryCodeRangeMap[key]
|
|
if !found {
|
|
return countryCode
|
|
}
|
|
|
|
for _, segment := range segments {
|
|
if segment.low <= elem && elem <= segment.high {
|
|
return segment.country
|
|
}
|
|
}
|
|
|
|
return countryCode
|
|
}
|