From def5886c0abc7c2c1fb50d59ba2e054a468bd131 Mon Sep 17 00:00:00 2001 From: andig Date: Thu, 29 Dec 2022 17:51:49 +0100 Subject: [PATCH] Create an offline vehicle when config fails (#5610) --- cmd/config.go | 5 +++-- vehicle/embed.go | 4 ++-- vehicle/wrapper/wrapper.go | 24 ++++++++++++++++++++---- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/cmd/config.go b/cmd/config.go index 16d3f5699..3101f9b00 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -270,14 +270,15 @@ func (cp *ConfigProvider) configureVehicles(conf config) error { if ccWithTitle.Title == "" { //lint:ignore SA1019 as Title is safe on ascii - cc.Other["title"] = strings.Title(cc.Name) + ccWithTitle.Title = strings.Title(cc.Name) + cc.Other["title"] = ccWithTitle.Title } v, err := vehicle.NewFromConfig(cc.Type, cc.Other) if err != nil { log.ERROR.Printf("creating vehicle %s failed: %v", cc.Name, err) // wrap any created errors to prevent fatals - v, _ = wrapper.New(v, err) + v, _ = wrapper.New(ccWithTitle.Title, err) } mu.Lock() diff --git a/vehicle/embed.go b/vehicle/embed.go index 956836573..7da19f0b8 100644 --- a/vehicle/embed.go +++ b/vehicle/embed.go @@ -47,12 +47,12 @@ func (v *embed) OnIdentified() api.ActionConfig { var _ api.FeatureDescriber = (*embed)(nil) -// Features implements the api.Describer interface +// Features implements the api.FeatureDescriber interface func (v *embed) Features() []api.Feature { return v.Features_ } -// Features implements the api.Describer interface +// Features implements the api.FeatureDescriber interface func (v *embed) Has(f api.Feature) bool { return slices.Contains(v.Features_, f) } diff --git a/vehicle/wrapper/wrapper.go b/vehicle/wrapper/wrapper.go index 62eda08d9..3de49eb10 100644 --- a/vehicle/wrapper/wrapper.go +++ b/vehicle/wrapper/wrapper.go @@ -8,13 +8,17 @@ import ( // Wrapper wraps an api.Vehicle to capture initialization errors type Wrapper struct { - err error + err error + title string + Features_ []api.Feature } // New creates a new Vehicle -func New(w api.Vehicle, err error) (api.Vehicle, error) { +func New(title string, err error) (api.Vehicle, error) { v := &Wrapper{ - err: fmt.Errorf("vehicle not available: %w", err), + err: fmt.Errorf("vehicle not available: %w", err), + title: fmt.Sprintf("%s (unavailable)", title), + Features_: []api.Feature{api.Offline}, } return v, nil @@ -24,7 +28,7 @@ var _ api.Vehicle = (*Wrapper)(nil) // Title implements the api.Vehicle interface func (v *Wrapper) Title() string { - return "unavailable" + return v.title } // Icon implements the api.Vehicle interface @@ -52,6 +56,18 @@ func (v *Wrapper) OnIdentified() api.ActionConfig { return api.ActionConfig{} } +var _ api.FeatureDescriber = (*Wrapper)(nil) + +// Features implements the api.FeatureDescriber interface +func (v *Wrapper) Features() []api.Feature { + return []api.Feature{api.Offline} +} + +// Features implements the api.FeatureDescriber interface +func (v *Wrapper) Has(f api.Feature) bool { + return f == api.Offline +} + var _ api.Battery = (*Wrapper)(nil) // Soc implements the api.Battery interface