From 71f0cae5eaf4aaddc2bb3e8a453247afcf5bdffe Mon Sep 17 00:00:00 2001 From: andig Date: Sun, 26 Sep 2021 19:37:00 +0200 Subject: [PATCH] Improve generating decorators (#1648) --- charger/evsewifi_decorators.go | 2 +- charger/keba_decorators.go | 2 +- charger/openwb_decorators.go | 2 +- charger/phoenix-em-eth_decorators.go | 2 +- charger/phoenix-ev-eth_decorators.go | 2 +- charger/wallbe_decorators.go | 2 +- charger/warp_decorators.go | 2 +- cmd/tools/decorate.go | 72 ++-------------------------- cmd/tools/decorate.tpl | 63 ++++++++++++++++++++++++ meter/lgess.go | 2 +- meter/lgess_decorators.go | 16 +++---- meter/meter_decorators.go | 2 +- meter/modbus_decorators.go | 2 +- meter/sma.go | 2 +- meter/sma_decorators.go | 2 +- meter/tesla.go | 4 +- meter/tesla_decorators.go | 16 +++---- vehicle/vehicle_decorators.go | 2 +- 18 files changed, 99 insertions(+), 98 deletions(-) create mode 100644 cmd/tools/decorate.tpl diff --git a/charger/evsewifi_decorators.go b/charger/evsewifi_decorators.go index f7ae76034..d0d7925f2 100644 --- a/charger/evsewifi_decorators.go +++ b/charger/evsewifi_decorators.go @@ -1,6 +1,6 @@ package charger -// Code generated by github.com/andig/cmd/tools/decorate.go. DO NOT EDIT. +// Code generated by github.com/evcc-io/evcc/cmd/tools/decorate.go. DO NOT EDIT. import ( "github.com/evcc-io/evcc/api" diff --git a/charger/keba_decorators.go b/charger/keba_decorators.go index 10a95a97a..e2c61befc 100644 --- a/charger/keba_decorators.go +++ b/charger/keba_decorators.go @@ -1,6 +1,6 @@ package charger -// Code generated by github.com/andig/cmd/tools/decorate.go. DO NOT EDIT. +// Code generated by github.com/evcc-io/evcc/cmd/tools/decorate.go. DO NOT EDIT. import ( "github.com/evcc-io/evcc/api" diff --git a/charger/openwb_decorators.go b/charger/openwb_decorators.go index 8ea4d9795..41120ffb9 100644 --- a/charger/openwb_decorators.go +++ b/charger/openwb_decorators.go @@ -1,6 +1,6 @@ package charger -// Code generated by github.com/andig/cmd/tools/decorate.go. DO NOT EDIT. +// Code generated by github.com/evcc-io/evcc/cmd/tools/decorate.go. DO NOT EDIT. import ( "github.com/evcc-io/evcc/api" diff --git a/charger/phoenix-em-eth_decorators.go b/charger/phoenix-em-eth_decorators.go index a2ffdfec0..a00059612 100644 --- a/charger/phoenix-em-eth_decorators.go +++ b/charger/phoenix-em-eth_decorators.go @@ -1,6 +1,6 @@ package charger -// Code generated by github.com/andig/cmd/tools/decorate.go. DO NOT EDIT. +// Code generated by github.com/evcc-io/evcc/cmd/tools/decorate.go. DO NOT EDIT. import ( "github.com/evcc-io/evcc/api" diff --git a/charger/phoenix-ev-eth_decorators.go b/charger/phoenix-ev-eth_decorators.go index 364fffb76..3f985b091 100644 --- a/charger/phoenix-ev-eth_decorators.go +++ b/charger/phoenix-ev-eth_decorators.go @@ -1,6 +1,6 @@ package charger -// Code generated by github.com/andig/cmd/tools/decorate.go. DO NOT EDIT. +// Code generated by github.com/evcc-io/evcc/cmd/tools/decorate.go. DO NOT EDIT. import ( "github.com/evcc-io/evcc/api" diff --git a/charger/wallbe_decorators.go b/charger/wallbe_decorators.go index ec4f75365..94518132b 100644 --- a/charger/wallbe_decorators.go +++ b/charger/wallbe_decorators.go @@ -1,6 +1,6 @@ package charger -// Code generated by github.com/andig/cmd/tools/decorate.go. DO NOT EDIT. +// Code generated by github.com/evcc-io/evcc/cmd/tools/decorate.go. DO NOT EDIT. import ( "github.com/evcc-io/evcc/api" diff --git a/charger/warp_decorators.go b/charger/warp_decorators.go index 926bd8332..0858111ad 100644 --- a/charger/warp_decorators.go +++ b/charger/warp_decorators.go @@ -1,6 +1,6 @@ package charger -// Code generated by github.com/andig/cmd/tools/decorate.go. DO NOT EDIT. +// Code generated by github.com/evcc-io/evcc/cmd/tools/decorate.go. DO NOT EDIT. import ( "github.com/evcc-io/evcc/api" diff --git a/cmd/tools/decorate.go b/cmd/tools/decorate.go index 11f2aa250..5403b3e54 100644 --- a/cmd/tools/decorate.go +++ b/cmd/tools/decorate.go @@ -2,6 +2,7 @@ package main import ( "bytes" + _ "embed" "errors" "fmt" "go/format" @@ -14,71 +15,8 @@ import ( "github.com/spf13/pflag" ) -var srcTmpl = ` -package {{.Package}} - -// Code generated by github.com/andig/cmd/tools/decorate.go. DO NOT EDIT. - -import ( - "{{.API}}" -) - -{{define "case"}} - {{- $combo := .Combo}} - {{- $prefix := .Prefix}} - {{- $idx := 0}} - - {{- range $typ, $def := .Types}} - {{- if gt $idx 0}} &&{{else}}{{$idx = 1}}{{end}} {{$def.VarName}} {{if contains $combo $typ}}!={{else}}=={{end}} nil - {{- end}}: - return &struct { - {{.BaseType}} -{{- range $typ, $def := .Types}} - {{- if contains $combo $typ}} - {{$typ}} - {{- end}} -{{- end}} - }{ - {{.ShortBase}}: base, -{{- range $typ, $def := .Types}} - {{- if contains $combo $typ}} - {{$def.ShortType}}: &{{$prefix}}{{$def.ShortType}}Impl{ - {{$def.VarName}}: {{$def.VarName}}, - }, - {{- end}} -{{- end}} - } -{{- end -}} - -func {{.Function}}(base {{.BaseType}}{{range ordered}}, {{.VarName}} func() {{slice .Signature 7}}{{end}}) {{.ReturnType}} { -{{- $basetype := .BaseType}} -{{- $shortbase := .ShortBase}} -{{- $prefix := .Function}} -{{- $types := .Types}} -{{- $idx := 0}} - switch { - case {{- range $typ, $def := .Types}} - {{- if gt $idx 0}} &&{{else}}{{$idx = 1}}{{end}} {{$def.VarName}} == nil - {{- end}}: - return base -{{range $combo := .Combinations}} - case {{- template "case" dict "BaseType" $basetype "Prefix" $prefix "ShortBase" $shortbase "Types" $types "Combo" $combo}} -{{end}} } - - return nil -} - -{{range .Types -}} -type {{$prefix}}{{.ShortType}}Impl struct { - {{.VarName}} {{.Signature}} -} - -func (impl *{{$prefix}}{{.ShortType}}Impl) {{.Function}}{{slice .Signature 4}} { - return impl.{{.VarName}}() -} - -{{end}} -` +//go:embed decorate.tpl +var srcTmpl string type dynamicType struct { typ, function, signature string @@ -248,9 +186,7 @@ func main() { formatted, err := format.Source([]byte(generated)) if err != nil { - fmt.Println(err) - fmt.Println(generated) - os.Exit(2) + formatted = []byte(generated) } if _, err := out.Write(formatted); err != nil { diff --git a/cmd/tools/decorate.tpl b/cmd/tools/decorate.tpl new file mode 100644 index 000000000..f164bde64 --- /dev/null +++ b/cmd/tools/decorate.tpl @@ -0,0 +1,63 @@ +package {{.Package}} + +// Code generated by github.com/evcc-io/evcc/cmd/tools/decorate.go. DO NOT EDIT. + +import ( + "{{.API}}" +) + +{{define "case"}} + {{- $combo := .Combo}} + {{- $prefix := .Prefix}} + {{- $idx := 0}} + + {{- range $typ, $def := .Types}} + {{- if gt $idx 0}} &&{{else}}{{$idx = 1}}{{end}} {{$def.VarName}} {{if contains $combo $typ}}!={{else}}=={{end}} nil + {{- end}}: + return &struct { + {{.BaseType}} +{{- range $typ, $def := .Types}} + {{- if contains $combo $typ}} + {{$typ}} + {{- end}} +{{- end}} + }{ + {{.ShortBase}}: base, +{{- range $typ, $def := .Types}} + {{- if contains $combo $typ}} + {{$def.ShortType}}: &{{$prefix}}{{$def.ShortType}}Impl{ + {{$def.VarName}}: {{$def.VarName}}, + }, + {{- end}} +{{- end}} + } +{{- end -}} + +func {{.Function}}(base {{.BaseType}}{{range ordered}}, {{.VarName}} func() {{slice .Signature 7}}{{end}}) {{.ReturnType}} { +{{- $basetype := .BaseType}} +{{- $shortbase := .ShortBase}} +{{- $prefix := .Function}} +{{- $types := .Types}} +{{- $idx := 0}} + switch { + case {{- range $typ, $def := .Types}} + {{- if gt $idx 0}} &&{{else}}{{$idx = 1}}{{end}} {{$def.VarName}} == nil + {{- end}}: + return base +{{range $combo := .Combinations}} + case {{- template "case" dict "BaseType" $basetype "Prefix" $prefix "ShortBase" $shortbase "Types" $types "Combo" $combo}} +{{end}} } + + return nil +} + +{{range .Types -}} +type {{$prefix}}{{.ShortType}}Impl struct { + {{.VarName}} {{.Signature}} +} + +func (impl *{{$prefix}}{{.ShortType}}Impl) {{.Function}}{{slice .Signature 4}} { + return impl.{{.VarName}}() +} + +{{end}} diff --git a/meter/lgess.go b/meter/lgess.go index 4503c881f..66161c5bc 100644 --- a/meter/lgess.go +++ b/meter/lgess.go @@ -49,7 +49,7 @@ func init() { registry.Add("lgess", NewLgEssFromConfig) } -//go:generate go run ../cmd/tools/decorate.go -f decorateLgEss -b api.Meter -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.Battery,SoC,func() (float64, error)" +//go:generate go run ../cmd/tools/decorate.go -f decorateLgEss -b *LgEss -r api.Meter -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.Battery,SoC,func() (float64, error)" // NewLgEssFromConfig creates an LgEss Meter from generic config func NewLgEssFromConfig(other map[string]interface{}) (api.Meter, error) { diff --git a/meter/lgess_decorators.go b/meter/lgess_decorators.go index ec9967322..044a005f8 100644 --- a/meter/lgess_decorators.go +++ b/meter/lgess_decorators.go @@ -1,22 +1,22 @@ package meter -// Code generated by github.com/andig/cmd/tools/decorate.go. DO NOT EDIT. +// Code generated by github.com/evcc-io/evcc/cmd/tools/decorate.go. DO NOT EDIT. import ( "github.com/evcc-io/evcc/api" ) -func decorateLgEss(base api.Meter, meterEnergy func() (float64, error), battery func() (float64, error)) api.Meter { +func decorateLgEss(base *LgEss, meterEnergy func() (float64, error), battery func() (float64, error)) api.Meter { switch { case battery == nil && meterEnergy == nil: return base case battery == nil && meterEnergy != nil: return &struct { - api.Meter + *LgEss api.MeterEnergy }{ - Meter: base, + LgEss: base, MeterEnergy: &decorateLgEssMeterEnergyImpl{ meterEnergy: meterEnergy, }, @@ -24,10 +24,10 @@ func decorateLgEss(base api.Meter, meterEnergy func() (float64, error), battery case battery != nil && meterEnergy == nil: return &struct { - api.Meter + *LgEss api.Battery }{ - Meter: base, + LgEss: base, Battery: &decorateLgEssBatteryImpl{ battery: battery, }, @@ -35,11 +35,11 @@ func decorateLgEss(base api.Meter, meterEnergy func() (float64, error), battery case battery != nil && meterEnergy != nil: return &struct { - api.Meter + *LgEss api.Battery api.MeterEnergy }{ - Meter: base, + LgEss: base, Battery: &decorateLgEssBatteryImpl{ battery: battery, }, diff --git a/meter/meter_decorators.go b/meter/meter_decorators.go index a77da26b8..78b58e043 100644 --- a/meter/meter_decorators.go +++ b/meter/meter_decorators.go @@ -1,6 +1,6 @@ package meter -// Code generated by github.com/andig/cmd/tools/decorate.go. DO NOT EDIT. +// Code generated by github.com/evcc-io/evcc/cmd/tools/decorate.go. DO NOT EDIT. import ( "github.com/evcc-io/evcc/api" diff --git a/meter/modbus_decorators.go b/meter/modbus_decorators.go index 08a86b481..f3625a301 100644 --- a/meter/modbus_decorators.go +++ b/meter/modbus_decorators.go @@ -1,6 +1,6 @@ package meter -// Code generated by github.com/andig/cmd/tools/decorate.go. DO NOT EDIT. +// Code generated by github.com/evcc-io/evcc/cmd/tools/decorate.go. DO NOT EDIT. import ( "github.com/evcc-io/evcc/api" diff --git a/meter/sma.go b/meter/sma.go index 2a43ce87e..a0c16bcbf 100644 --- a/meter/sma.go +++ b/meter/sma.go @@ -25,7 +25,7 @@ func init() { registry.Add("sma", NewSMAFromConfig) } -//go:generate go run ../cmd/tools/decorate.go -f decorateSMA -r api.Meter -b *SMA -t "api.Battery,SoC,func() (float64, error)" +//go:generate go run ../cmd/tools/decorate.go -f decorateSMA -b *SMA -r api.Meter -t "api.Battery,SoC,func() (float64, error)" // NewSMAFromConfig creates a SMA Meter from generic config func NewSMAFromConfig(other map[string]interface{}) (api.Meter, error) { diff --git a/meter/sma_decorators.go b/meter/sma_decorators.go index a35e47c5c..58d1ea350 100644 --- a/meter/sma_decorators.go +++ b/meter/sma_decorators.go @@ -1,6 +1,6 @@ package meter -// Code generated by github.com/andig/cmd/tools/decorate.go. DO NOT EDIT. +// Code generated by github.com/evcc-io/evcc/cmd/tools/decorate.go. DO NOT EDIT. import ( "github.com/evcc-io/evcc/api" diff --git a/meter/tesla.go b/meter/tesla.go index 5316162fa..e3d5e6ee1 100644 --- a/meter/tesla.go +++ b/meter/tesla.go @@ -26,7 +26,7 @@ func init() { registry.Add("tesla", NewTeslaFromConfig) } -//go:generate go run ../cmd/tools/decorate.go -f decorateTesla -b api.Meter -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.Battery,SoC,func() (float64, error)" +//go:generate go run ../cmd/tools/decorate.go -f decorateTesla -b *Tesla -r api.Meter -t "api.MeterEnergy,TotalEnergy,func() (float64, error)" -t "api.Battery,SoC,func() (float64, error)" // NewTeslaFromConfig creates a Tesla Powerwall Meter from generic config func NewTeslaFromConfig(other map[string]interface{}) (api.Meter, error) { @@ -115,6 +115,8 @@ func (m *Tesla) Login() error { return err } +var _ api.Meter = (*Tesla)(nil) + // CurrentPower implements the api.Meter interface func (m *Tesla) CurrentPower() (float64, error) { var res powerwall.MeterResponse diff --git a/meter/tesla_decorators.go b/meter/tesla_decorators.go index db095e3b3..29e8d2332 100644 --- a/meter/tesla_decorators.go +++ b/meter/tesla_decorators.go @@ -1,22 +1,22 @@ package meter -// Code generated by github.com/andig/cmd/tools/decorate.go. DO NOT EDIT. +// Code generated by github.com/evcc-io/evcc/cmd/tools/decorate.go. DO NOT EDIT. import ( "github.com/evcc-io/evcc/api" ) -func decorateTesla(base api.Meter, meterEnergy func() (float64, error), battery func() (float64, error)) api.Meter { +func decorateTesla(base *Tesla, meterEnergy func() (float64, error), battery func() (float64, error)) api.Meter { switch { case battery == nil && meterEnergy == nil: return base case battery == nil && meterEnergy != nil: return &struct { - api.Meter + *Tesla api.MeterEnergy }{ - Meter: base, + Tesla: base, MeterEnergy: &decorateTeslaMeterEnergyImpl{ meterEnergy: meterEnergy, }, @@ -24,10 +24,10 @@ func decorateTesla(base api.Meter, meterEnergy func() (float64, error), battery case battery != nil && meterEnergy == nil: return &struct { - api.Meter + *Tesla api.Battery }{ - Meter: base, + Tesla: base, Battery: &decorateTeslaBatteryImpl{ battery: battery, }, @@ -35,11 +35,11 @@ func decorateTesla(base api.Meter, meterEnergy func() (float64, error), battery case battery != nil && meterEnergy != nil: return &struct { - api.Meter + *Tesla api.Battery api.MeterEnergy }{ - Meter: base, + Tesla: base, Battery: &decorateTeslaBatteryImpl{ battery: battery, }, diff --git a/vehicle/vehicle_decorators.go b/vehicle/vehicle_decorators.go index 20f56ee80..ba953b789 100644 --- a/vehicle/vehicle_decorators.go +++ b/vehicle/vehicle_decorators.go @@ -1,6 +1,6 @@ package vehicle -// Code generated by github.com/andig/cmd/tools/decorate.go. DO NOT EDIT. +// Code generated by github.com/evcc-io/evcc/cmd/tools/decorate.go. DO NOT EDIT. import ( "github.com/evcc-io/evcc/api"