Files
cloud-services/pkg/utils/vin_parser.go

127 lines
3.0 KiB
Go

package utils
import (
"github.com/fiskerinc/cloud-services/pkg/common"
"github.com/fiskerinc/cloud-services/pkg/validator"
"github.com/fiskerinc/cloud-services/pkg/vindecoder"
"github.com/pkg/errors"
"github.com/fiskerinc/cloud-services/pkg/utils/envtool"
)
var (
defaultCountry = envtool.GetEnv("DEFAULT_VEH_COUNTRY", "Unknown")
defaultModel = envtool.GetEnv("DEFAULT_VEH_MODEL", "Ocean")
defaultYear = envtool.GetEnvInt("DEFAULT_VEH_YEAR", 2022)
defaultTrim = envtool.GetEnv("DEFAULT_VEH_TRIM", "Unknown")
defaultPowertrain = envtool.GetEnv("DEFAULT_VEH_POWERTRAIN", "Unknown")
defaultRestraint = envtool.GetEnv("DEFAULT_VEH_RESTRAINT", "Unknown")
defaultBodyType = envtool.GetEnv("DEFAULT_VEH_BODY_TYPE", "Unknown")
)
func ParseVIN(vin string) (*common.Car, error) {
if vin == "" {
return nil, errors.Errorf("vin is empty")
}
vinInfo, _ := vindecoder.DecodeVIN(vin)
// for all vins, do a simple regex validation
valid := validator.ValidateVINSimple(vin)
if !valid {
return nil, errors.Errorf("vin %v is invalid", vin)
}
// for all vins, do a checksum validation
if !vinInfo.IsValid {
return nil, errors.Errorf("vin %v is invalid", vin)
}
var defaultRegion common.RegionCode
switch defaultRestraint {
case "US Specs":
defaultRegion = common.US
case "EU Specs":
defaultRegion = common.EU
default:
defaultRegion = common.US
}
if vinInfo.Manufacturer != "Fisker GmbH" {
// for non-Fisker vins, use default values
return &common.Car{
VIN: vin,
Region: defaultRegion,
Country: defaultCountry,
Model: defaultModel,
Trim: defaultTrim,
Year: defaultYear,
Powertrain: defaultPowertrain,
Restraint: defaultRestraint,
BodyType: defaultBodyType,
}, nil
}
if vinInfo.Country == "" {
vinInfo.Country = defaultCountry
}
if vinInfo.Model == "" {
vinInfo.Model = defaultModel
}
if vinInfo.Trim == "" {
vinInfo.Trim = defaultTrim
}
if vinInfo.Powertrain == "" {
vinInfo.Powertrain = defaultPowertrain
}
if vinInfo.Restraint == "" {
vinInfo.Restraint = defaultRestraint
}
if vinInfo.BodyType == "" {
vinInfo.BodyType = defaultBodyType
}
var region common.RegionCode
switch vinInfo.Restraint {
case "US Specs":
region = common.US
case "EU Specs":
region = common.EU
}
return &common.Car{
VIN: vin,
Region: region,
Country: vinInfo.Country,
Model: vinInfo.Model,
Trim: vinInfo.Trim,
Year: vinInfo.Year,
Powertrain: vinInfo.Powertrain,
Restraint: vinInfo.Restraint,
BodyType: vinInfo.BodyType,
}, nil
}
func ParseVINs(vins []string) ([]*common.Car, error) {
if len(vins) == 0 {
return nil, errors.Errorf("vin list is empty")
}
var cars []*common.Car
var invalidVINs []string
for _, vin := range vins {
car, err := ParseVIN(vin)
if err != nil {
invalidVINs = append(invalidVINs, vin)
} else {
cars = append(cars, car)
}
}
if len(invalidVINs) > 0 {
return cars, errors.Errorf("vins %+q are invalid", invalidVINs)
}
return cars, nil
}