evcc-io/provider/javascript.go
2020-12-10 12:00:13 +01:00

119 lines
2.3 KiB
Go

package provider
import (
"github.com/andig/evcc/util"
"github.com/robertkrimen/otto"
)
// Javascript implements Javascript request provider
type Javascript struct {
log *util.Logger
vm *otto.Otto
script string
}
func init() {
registry.Add("js", NewJavascriptProviderFromConfig)
}
// NewJavascriptProviderFromConfig creates a HTTP provider
func NewJavascriptProviderFromConfig(other map[string]interface{}) (IntProvider, error) {
cc := struct {
Script string
}{}
if err := util.DecodeOther(other, &cc); err != nil {
return nil, err
}
log := util.NewLogger("js")
p := &Javascript{
log: log,
vm: otto.New(),
script: cc.Script,
}
return p, nil
}
// FloatGetter parses float from request
func (p *Javascript) FloatGetter() func() (float64, error) {
return func() (res float64, err error) {
v, err := p.vm.Eval(p.script)
if err == nil {
res, err = v.ToFloat()
}
return res, err
}
}
// IntGetter parses int64 from request
func (p *Javascript) IntGetter() func() (int64, error) {
return func() (res int64, err error) {
v, err := p.vm.Eval(p.script)
if err == nil {
res, err = v.ToInteger()
}
return res, err
}
}
// StringGetter sends string request
func (p *Javascript) StringGetter() func() (string, error) {
return func() (res string, err error) {
v, err := p.vm.Eval(p.script)
if err == nil {
res, err = v.ToString()
}
return res, err
}
}
// BoolGetter parses bool from request
func (p *Javascript) BoolGetter() func() (bool, error) {
return func() (res bool, err error) {
v, err := p.vm.Eval(p.script)
if err == nil {
res, err = v.ToBoolean()
}
return res, err
}
}
// IntSetter sends int request
func (p *Javascript) IntSetter(param string) func(int64) error {
return func(val int64) error {
err := p.vm.Set(param, val)
if err == nil {
_, err = p.vm.Eval(p.script)
}
return err
}
}
// StringSetter sends string request
func (p *Javascript) StringSetter(param string) func(string) error {
return func(val string) error {
err := p.vm.Set(param, val)
if err == nil {
_, err = p.vm.Eval(p.script)
}
return err
}
}
// BoolSetter sends bool request
func (p *Javascript) BoolSetter(param string) func(bool) error {
return func(val bool) error {
err := p.vm.Set(param, val)
if err == nil {
_, err = p.vm.Eval(p.script)
}
return err
}
}