mirror of
https://github.com/wader/fq.git
synced 2024-12-01 02:30:32 +03:00
60 lines
1014 B
Go
60 lines
1014 B
Go
|
package interp
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
|
||
|
"github.com/wader/gojq"
|
||
|
)
|
||
|
|
||
|
func init() {
|
||
|
functionRegisterFns = append(functionRegisterFns, func(i *Interp) []Function {
|
||
|
return []Function{
|
||
|
{"_query_fromstring", 0, 0, i.queryFromString, nil},
|
||
|
{"_query_tostring", 0, 0, i.queryToString, nil},
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func (i *Interp) queryFromString(c interface{}, a []interface{}) interface{} {
|
||
|
s, err := toString(c)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
q, err := gojq.Parse(s)
|
||
|
if err != nil {
|
||
|
p := queryErrorPosition(s, err)
|
||
|
return compileError{
|
||
|
err: err,
|
||
|
what: "parse",
|
||
|
pos: p,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// TODO: use mapstruct?
|
||
|
b, err := json.Marshal(q)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
var v interface{}
|
||
|
if err := json.Unmarshal(b, &v); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return v
|
||
|
|
||
|
}
|
||
|
|
||
|
func (i *Interp) queryToString(c interface{}, a []interface{}) interface{} {
|
||
|
b, err := json.Marshal(c)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
var q gojq.Query
|
||
|
if err := json.Unmarshal(b, &q); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return q.String()
|
||
|
}
|