chore: make vin extraction more flexible

This commit is contained in:
andig 2024-05-26 16:20:10 +02:00
parent 37604d8264
commit 431066eebb
15 changed files with 38 additions and 44 deletions

View file

@ -76,8 +76,8 @@ func NewAudiFromConfig(other map[string]interface{}) (api.Vehicle, error) {
defer cancel()
return api.Vehicles(ctx)
},
func(v etron.Vehicle) string {
return v.VIN
func(v etron.Vehicle) (string, error) {
return v.VIN, nil
},
)

View file

@ -84,8 +84,8 @@ func newBluelinkFromConfig(brand string, other map[string]interface{}, settings
vehicle, err := ensureVehicleEx(
cc.VIN, api.Vehicles,
func(v bluelink.Vehicle) string {
return v.VIN
func(v bluelink.Vehicle) (string, error) {
return v.VIN, nil
},
)
if err != nil {

View file

@ -65,8 +65,8 @@ func NewBMWMiniFromConfig(brand string, other map[string]interface{}) (api.Vehic
vehicle, err := ensureVehicleEx(
cc.VIN, api.Vehicles,
func(v bmw.Vehicle) string {
return v.VIN
func(v bmw.Vehicle) (string, error) {
return v.VIN, nil
},
)

View file

@ -54,20 +54,9 @@ func NewFordConnectFromConfig(other map[string]interface{}) (api.Vehicle, error)
api := connect.NewAPI(log, identity)
var vinErr error
vehicle, err := ensureVehicleEx(cc.VIN, api.Vehicles, func(v connect.Vehicle) string {
if vinErr != nil {
return ""
}
vin, err := api.VIN(v.VehicleID)
if err != nil {
vinErr = err
}
return vin
vehicle, err := ensureVehicleEx(cc.VIN, api.Vehicles, func(v connect.Vehicle) (string, error) {
return api.VIN(v.VehicleID)
})
if err == nil {
err = vinErr
}
if err != nil {
return nil, err
}

View file

@ -9,8 +9,8 @@ import (
// ensureVehicle extracts VIN from list of VINs returned from `list` function
func ensureVehicle(vin string, list func() ([]string, error)) (string, error) {
return ensureVehicleEx(vin, list, func(v string) string {
return v
return ensureVehicleEx(vin, list, func(v string) (string, error) {
return v, nil
})
}
@ -18,7 +18,7 @@ func ensureVehicle(vin string, list func() ([]string, error)) (string, error) {
func ensureVehicleEx[T any](
vin string,
list func() ([]T, error),
extract func(T) string,
extract func(T) (string, error),
) (T, error) {
var zero T
@ -30,7 +30,11 @@ func ensureVehicleEx[T any](
if vin := strings.ToUpper(vin); vin != "" {
// vin defined
for _, vehicle := range vehicles {
if vin == extract(vehicle) {
vv, err := extract(vehicle)
if err != nil {
return zero, err
}
if strings.ToUpper(vv) == vin {
return vehicle, nil
}
}
@ -40,6 +44,7 @@ func ensureVehicleEx[T any](
}
return zero, fmt.Errorf("cannot find vehicle, got: %v", lo.Map(vehicles, func(v T, _ int) string {
return extract(v)
vin, _ := extract(v)
return vin
}))
}

View file

@ -55,8 +55,8 @@ func NewPolestarFromConfig(other map[string]interface{}) (api.Vehicle, error) {
ctx, cancel := context.WithTimeout(context.Background(), cc.Timeout)
defer cancel()
return api.Vehicles(ctx)
}, func(v polestar.ConsumerCar) string {
return v.VIN
}, func(v polestar.ConsumerCar) (string, error) {
return v.VIN, nil
})
if err == nil {

View file

@ -48,8 +48,8 @@ func NewPorscheFromConfig(other map[string]interface{}) (api.Vehicle, error) {
vehicle, err := ensureVehicleEx(
cc.VIN, api.Vehicles,
func(v porsche.Vehicle) string {
return v.VIN
func(v porsche.Vehicle) (string, error) {
return v.VIN, nil
},
)
if err != nil {

View file

@ -77,8 +77,8 @@ func newPSA(brand, realm string, other map[string]interface{}) (api.Vehicle, err
vehicle, err := ensureVehicleEx(
cc.VIN, api.Vehicles,
func(v psa.Vehicle) string {
return v.VIN
func(v psa.Vehicle) (string, error) {
return v.VIN, nil
},
)
if err != nil {

View file

@ -85,8 +85,8 @@ func NewRenaultDaciaFromConfig(brand string, other map[string]interface{}) (api.
func() ([]kamereon.Vehicle, error) {
return api.Vehicles(accountID)
},
func(v kamereon.Vehicle) string {
return v.VIN
func(v kamereon.Vehicle) (string, error) {
return v.VIN, nil
},
)

View file

@ -68,8 +68,8 @@ func NewCupraFromConfig(other map[string]interface{}) (api.Vehicle, error) {
cc.VIN, func() ([]cupra.Vehicle, error) {
return api.Vehicles(ui.Subject)
},
func(v cupra.Vehicle) string {
return v.VIN
func(v cupra.Vehicle) (string, error) {
return v.VIN, nil
},
)

View file

@ -61,8 +61,8 @@ func NewEnyaqFromConfig(other map[string]interface{}) (api.Vehicle, error) {
vehicle, err := ensureVehicleEx(
cc.VIN, api.Vehicles,
func(v skoda.Vehicle) string {
return v.VIN
func(v skoda.Vehicle) (string, error) {
return v.VIN, nil
},
)

View file

@ -61,8 +61,8 @@ func NewSkodaFromConfig(other map[string]interface{}) (api.Vehicle, error) {
vehicle, err := ensureVehicleEx(
cc.VIN, api.Vehicles,
func(v skoda.Vehicle) string {
return v.VIN
func(v skoda.Vehicle) (string, error) {
return v.VIN, nil
},
)

View file

@ -86,8 +86,8 @@ func NewTeslaFromConfig(other map[string]interface{}) (api.Vehicle, error) {
vehicle, err := ensureVehicleEx(
cc.VIN, tc.Vehicles,
func(v *tesla.Vehicle) string {
return v.Vin
func(v *tesla.Vehicle) (string, error) {
return v.Vin, nil
},
)
if err != nil {

View file

@ -111,8 +111,8 @@ func NewTronityFromConfig(other map[string]interface{}) (api.Vehicle, error) {
vehicle, err := ensureVehicleEx(
cc.VIN, v.vehicles,
func(v tronity.Vehicle) string {
return v.VIN
func(v tronity.Vehicle) (string, error) {
return v.VIN, nil
},
)
if err != nil {

View file

@ -66,8 +66,8 @@ func NewIDFromConfig(other map[string]interface{}) (api.Vehicle, error) {
vehicle, err := ensureVehicleEx(
cc.VIN, api.Vehicles,
func(v id.Vehicle) string {
return v.VIN
func(v id.Vehicle) (string, error) {
return v.VIN, nil
},
)