2021-01-22 14:32:29 +00:00
|
|
|
package oracle
|
|
|
|
|
|
|
|
import (
|
2021-05-07 16:48:57 +00:00
|
|
|
"bytes"
|
2021-01-22 14:32:29 +00:00
|
|
|
"errors"
|
|
|
|
"unicode/utf8"
|
|
|
|
|
2021-09-15 12:01:01 +00:00
|
|
|
json "github.com/nspcc-dev/go-ordered-json"
|
2021-03-12 11:15:40 +00:00
|
|
|
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
2021-04-22 14:22:09 +00:00
|
|
|
"github.com/nspcc-dev/neo-go/pkg/services/oracle/jsonpath"
|
2021-01-22 14:32:29 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func filter(value []byte, path string) ([]byte, error) {
|
|
|
|
if !utf8.Valid(value) {
|
|
|
|
return nil, errors.New("not an UTF-8")
|
|
|
|
}
|
2021-05-07 16:48:57 +00:00
|
|
|
|
|
|
|
buf := bytes.NewBuffer(value)
|
|
|
|
d := json.NewDecoder(buf)
|
|
|
|
d.UseOrderedObject()
|
|
|
|
|
2021-01-22 14:32:29 +00:00
|
|
|
var v interface{}
|
2021-05-07 16:48:57 +00:00
|
|
|
if err := d.Decode(&v); err != nil {
|
2021-01-22 14:32:29 +00:00
|
|
|
return nil, err
|
|
|
|
}
|
2021-04-22 14:22:09 +00:00
|
|
|
|
|
|
|
result, ok := jsonpath.Get(path, v)
|
|
|
|
if !ok {
|
|
|
|
return nil, errors.New("invalid filter")
|
2021-01-22 14:32:29 +00:00
|
|
|
}
|
2021-04-22 14:22:09 +00:00
|
|
|
return json.Marshal(result)
|
2021-01-22 14:32:29 +00:00
|
|
|
}
|
2021-03-12 11:15:40 +00:00
|
|
|
|
2021-11-23 15:24:07 +00:00
|
|
|
func filterRequest(result []byte, req *state.OracleRequest) ([]byte, error) {
|
2021-03-12 11:15:40 +00:00
|
|
|
if req.Filter != nil {
|
2021-11-23 15:24:07 +00:00
|
|
|
return filter(result, *req.Filter)
|
2021-03-12 11:15:40 +00:00
|
|
|
}
|
2021-11-23 15:24:07 +00:00
|
|
|
return result, nil
|
2021-03-12 11:15:40 +00:00
|
|
|
}
|