literal: some better typing

This commit is contained in:
Michael Muré
2024-11-04 11:15:12 +01:00
parent 6717a3a89c
commit 400f689a85
2 changed files with 19 additions and 24 deletions

View File

@@ -27,13 +27,8 @@ func Null() ipld.Node {
return nb.Build() return nb.Build()
} }
// Map creates an IPLD node from a map[string]interface{} // Map creates an IPLD node from a map[string]any
func Map(v interface{}) (ipld.Node, error) { func Map(m map[string]any) (ipld.Node, error) {
m, ok := v.(map[string]interface{})
if !ok {
return nil, fmt.Errorf("expected map[string]interface{}, got %T", v)
}
nb := basicnode.Prototype.Map.NewBuilder() nb := basicnode.Prototype.Map.NewBuilder()
ma, err := nb.BeginMap(int64(len(m))) ma, err := nb.BeginMap(int64(len(m)))
if err != nil { if err != nil {
@@ -50,7 +45,7 @@ func Map(v interface{}) (ipld.Node, error) {
if err := ma.AssembleValue().AssignString(x); err != nil { if err := ma.AssembleValue().AssignString(x); err != nil {
return nil, err return nil, err
} }
case []interface{}: case []any:
lb := basicnode.Prototype.List.NewBuilder() lb := basicnode.Prototype.List.NewBuilder()
la, err := lb.BeginList(int64(len(x))) la, err := lb.BeginList(int64(len(x)))
if err != nil { if err != nil {
@@ -62,7 +57,7 @@ func Map(v interface{}) (ipld.Node, error) {
if err := ma.AssembleValue().AssignNode(lb.Build()); err != nil { if err := ma.AssembleValue().AssignNode(lb.Build()); err != nil {
return nil, err return nil, err
} }
case map[string]interface{}: case map[string]any:
nestedNode, err := Map(x) // recursive call for nested maps nestedNode, err := Map(x) // recursive call for nested maps
if err != nil { if err != nil {
return nil, err return nil, err

View File

@@ -518,61 +518,61 @@ func TestOptionalSelectors(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
policy Policy policy Policy
data interface{} data map[string]any
expected bool expected bool
}{ }{
{ {
name: "missing optional field returns true", name: "missing optional field returns true",
policy: MustConstruct(Equal(".field?", literal.String("value"))), policy: MustConstruct(Equal(".field?", literal.String("value"))),
data: map[string]interface{}{}, data: map[string]any{},
expected: true, expected: true,
}, },
{ {
name: "present optional field with matching value returns true", name: "present optional field with matching value returns true",
policy: MustConstruct(Equal(".field?", literal.String("value"))), policy: MustConstruct(Equal(".field?", literal.String("value"))),
data: map[string]interface{}{"field": "value"}, data: map[string]any{"field": "value"},
expected: true, expected: true,
}, },
{ {
name: "present optional field with non-matching value returns false", name: "present optional field with non-matching value returns false",
policy: MustConstruct(Equal(".field?", literal.String("value"))), policy: MustConstruct(Equal(".field?", literal.String("value"))),
data: map[string]interface{}{"field": "other"}, data: map[string]any{"field": "other"},
expected: false, expected: false,
}, },
{ {
name: "missing non-optional field returns false", name: "missing non-optional field returns false",
policy: MustConstruct(Equal(".field", literal.String("value"))), policy: MustConstruct(Equal(".field", literal.String("value"))),
data: map[string]interface{}{}, data: map[string]any{},
expected: false, expected: false,
}, },
{ {
name: "nested missing non-optional field returns false", name: "nested missing non-optional field returns false",
policy: MustConstruct(Equal(".outer?.inner", literal.String("value"))), policy: MustConstruct(Equal(".outer?.inner", literal.String("value"))),
data: map[string]interface{}{"outer": map[string]interface{}{}}, data: map[string]any{"outer": map[string]interface{}{}},
expected: false, expected: false,
}, },
{ {
name: "completely missing nested optional path returns true", name: "completely missing nested optional path returns true",
policy: MustConstruct(Equal(".outer?.inner?", literal.String("value"))), policy: MustConstruct(Equal(".outer?.inner?", literal.String("value"))),
data: map[string]interface{}{}, data: map[string]any{},
expected: true, expected: true,
}, },
{ {
name: "partially present nested optional path with missing end returns true", name: "partially present nested optional path with missing end returns true",
policy: MustConstruct(Equal(".outer?.inner?", literal.String("value"))), policy: MustConstruct(Equal(".outer?.inner?", literal.String("value"))),
data: map[string]interface{}{"outer": map[string]interface{}{}}, data: map[string]any{"outer": map[string]interface{}{}},
expected: true, expected: true,
}, },
{ {
name: "optional array index returns true when array is empty", name: "optional array index returns true when array is empty",
policy: MustConstruct(Equal(".array[0]?", literal.String("value"))), policy: MustConstruct(Equal(".array[0]?", literal.String("value"))),
data: map[string]interface{}{"array": []interface{}{}}, data: map[string]any{"array": []interface{}{}},
expected: true, expected: true,
}, },
{ {
name: "non-optional array index returns false when array is empty", name: "non-optional array index returns false when array is empty",
policy: MustConstruct(Equal(".array[0]", literal.String("value"))), policy: MustConstruct(Equal(".array[0]", literal.String("value"))),
data: map[string]interface{}{"array": []interface{}{}}, data: map[string]any{"array": []interface{}{}},
expected: false, expected: false,
}, },
} }
@@ -596,7 +596,7 @@ func TestPartialMatch(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
policy Policy policy Policy
data interface{} data map[string]any
expectedMatch bool expectedMatch bool
expectedStmt Statement expectedStmt Statement
}{ }{
@@ -605,7 +605,7 @@ func TestPartialMatch(t *testing.T) {
policy: MustConstruct( policy: MustConstruct(
Equal(".field", literal.String("value")), Equal(".field", literal.String("value")),
), ),
data: map[string]interface{}{}, data: map[string]any{},
expectedMatch: true, expectedMatch: true,
expectedStmt: nil, expectedStmt: nil,
}, },
@@ -615,7 +615,7 @@ func TestPartialMatch(t *testing.T) {
Equal(".foo", literal.String("correct")), Equal(".foo", literal.String("correct")),
Equal(".missing", literal.String("whatever")), Equal(".missing", literal.String("whatever")),
), ),
data: map[string]interface{}{ data: map[string]any{
"foo": "correct", "foo": "correct",
}, },
expectedMatch: true, expectedMatch: true,
@@ -627,7 +627,7 @@ func TestPartialMatch(t *testing.T) {
Equal(".foo", literal.String("value1")), Equal(".foo", literal.String("value1")),
Equal(".bar", literal.String("value2")), Equal(".bar", literal.String("value2")),
), ),
data: map[string]interface{}{ data: map[string]any{
"foo": "wrong", "foo": "wrong",
"bar": "value2", "bar": "value2",
}, },
@@ -642,7 +642,7 @@ func TestPartialMatch(t *testing.T) {
Equal(".missing", literal.String("value")), Equal(".missing", literal.String("value")),
Equal(".present", literal.String("wrong")), Equal(".present", literal.String("wrong")),
), ),
data: map[string]interface{}{ data: map[string]any{
"present": "actual", "present": "actual",
}, },
expectedMatch: false, expectedMatch: false,