mirror of
https://github.com/xaionaro-go/streamctl.git
synced 2025-09-27 03:45:52 +08:00
41 lines
744 B
Go
41 lines
744 B
Go
package expression
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"text/template"
|
|
)
|
|
|
|
func Eval[T any](
|
|
expr Expression,
|
|
evalCtx any,
|
|
) (T, error) {
|
|
var result T
|
|
|
|
tmpl, err := template.New("").Funcs(funcMap).Parse(string(expr))
|
|
if err != nil {
|
|
return result, fmt.Errorf("unable to parse the template: %w", err)
|
|
}
|
|
|
|
var buf bytes.Buffer
|
|
err = tmpl.Execute(&buf, evalCtx)
|
|
if err != nil {
|
|
return result, fmt.Errorf("unable to execute the template: %w", err)
|
|
}
|
|
|
|
value := buf.String()
|
|
if value == "" {
|
|
return result, nil
|
|
}
|
|
|
|
if v, ok := any(value).(T); ok {
|
|
return v, nil
|
|
}
|
|
_, err = fmt.Sscanf(value, "%v", &result)
|
|
if err != nil {
|
|
return result, fmt.Errorf("unable to scan value '%v' into %T: %w", value, result, err)
|
|
}
|
|
|
|
return result, nil
|
|
}
|