diff --git a/capability/policy/ipld.go b/capability/policy/ipld.go index d11620c..9ee02c1 100644 --- a/capability/policy/ipld.go +++ b/capability/policy/ipld.go @@ -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 { diff --git a/capability/policy/ipld_test.go b/capability/policy/ipld_test.go index dfb3216..c3aa729 100644 --- a/capability/policy/ipld_test.go +++ b/capability/policy/ipld_test.go @@ -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", - ["or", [ - ["==", ".", "news"], - ["==", ".", "press"]] + ["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)) } }