Improve generating decorators (#1648)
This commit is contained in:
parent
d2e3c47e10
commit
71f0cae5ea
18 changed files with 99 additions and 98 deletions
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
63
cmd/tools/decorate.tpl
Normal file
63
cmd/tools/decorate.tpl
Normal file
|
|
@ -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}}
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue