policy: working IPLD round-trip
This commit is contained in:
@@ -3,6 +3,8 @@ package policy
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/ipld/go-ipld-prime"
|
||||
"github.com/ipld/go-ipld-prime/codec/dagjson"
|
||||
"github.com/ipld/go-ipld-prime/datamodel"
|
||||
"github.com/ipld/go-ipld-prime/must"
|
||||
"github.com/ipld/go-ipld-prime/node/basicnode"
|
||||
@@ -10,10 +12,18 @@ import (
|
||||
"github.com/ucan-wg/go-ucan/v1/capability/policy/selector"
|
||||
)
|
||||
|
||||
func PolicyFromIPLD(node datamodel.Node) (Policy, error) {
|
||||
func FromIPLD(node datamodel.Node) (Policy, error) {
|
||||
return statementsFromIPLD("/", node)
|
||||
}
|
||||
|
||||
func FromDagJson(json string) (Policy, error) {
|
||||
nodes, err := ipld.Decode([]byte(json), dagjson.Decode)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return FromIPLD(nodes)
|
||||
}
|
||||
|
||||
func statementFromIPLD(path string, node datamodel.Node) (Statement, error) {
|
||||
// sanity checks
|
||||
if node.Kind() != datamodel.Kind_List {
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
package policy
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/ipld/go-ipld-prime"
|
||||
@@ -11,38 +9,37 @@ import (
|
||||
)
|
||||
|
||||
func TestIpldRoundTrip(t *testing.T) {
|
||||
const illustrativeExample = `[
|
||||
const illustrativeExample = `
|
||||
[
|
||||
["==", ".status", "draft"],
|
||||
["all", ".reviewer", [["like", ".email", "*@example.com"]]],
|
||||
["any", ".tags",
|
||||
["all", ".reviewer", [
|
||||
["like", ".email", "*@example.com"]]
|
||||
],
|
||||
["any", ".tags", [
|
||||
["or", [
|
||||
["==", ".", "news"],
|
||||
["==", ".", "press"]]
|
||||
]]
|
||||
]
|
||||
]`
|
||||
|
||||
for _, tc := range []struct {
|
||||
name, dagjson string
|
||||
name, dagJsonStr string
|
||||
}{
|
||||
{"illustrativeExample", illustrativeExample},
|
||||
} {
|
||||
// strip all spaces and carriage return
|
||||
asDagJson := strings.Join(strings.Fields(tc.dagjson), "")
|
||||
|
||||
nodes, err := ipld.Decode([]byte(asDagJson), dagjson.Decode)
|
||||
nodes, err := ipld.Decode([]byte(tc.dagJsonStr), dagjson.Decode)
|
||||
require.NoError(t, err)
|
||||
|
||||
pol, err := PolicyFromIPLD(nodes)
|
||||
pol, err := FromIPLD(nodes)
|
||||
require.NoError(t, err)
|
||||
|
||||
fmt.Println(pol)
|
||||
|
||||
wroteIpld, err := pol.ToIPLD()
|
||||
require.NoError(t, err)
|
||||
|
||||
wroteAsDagJson, err := ipld.Encode(wroteIpld, dagjson.Encode)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, asDagJson, string(wroteAsDagJson))
|
||||
require.JSONEq(t, tc.dagJsonStr, string(wroteAsDagJson))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user