policy: working IPLD round-trip

This commit is contained in:
Michael Muré
2024-09-02 02:25:34 +02:00
parent 20efcebab0
commit ab2f074b22
2 changed files with 25 additions and 18 deletions

View File

@@ -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 {

View File

@@ -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))
}
}