Skip to content

Commit

Permalink
feat: add map amender tests
Browse files Browse the repository at this point in the history
  • Loading branch information
smrz2001 committed Jul 14, 2023
1 parent 8984f18 commit e3c116a
Show file tree
Hide file tree
Showing 5 changed files with 438 additions and 69 deletions.
14 changes: 7 additions & 7 deletions datamodel/amender.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,17 @@ type containerAmender interface {
Empty() bool
Length() int64
Clear()
Values() ([]Node, error)
Values() (Node, error) // returns a list node with the values

NodeAmender
}

// MapAmender adds a map-like interface to NodeAmender
type MapAmender interface {
Put(key string, value Node) (bool, error)
Get(key string) (Node, error)
Remove(key string) (bool, error)
Keys() ([]string, error)
Put(key Node, value Node) error
Get(key Node) (Node, error)
Remove(key Node) (bool, error)
Keys() (Node, error) // returns a list node with the keys

containerAmender
}
Expand All @@ -39,8 +39,8 @@ type MapAmender interface {
type ListAmender interface {
Get(idx int64) (Node, error)
Remove(idx int64) error
Append(values ...Node) error
Insert(idx int64, values ...Node) error
Append(values Node) error // accepts a list node
Insert(idx int64, values Node) error // accepts a list node
Set(idx int64, value Node) error

containerAmender
Expand Down
35 changes: 6 additions & 29 deletions node/basicnode/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -284,12 +284,12 @@ func (nb *plainList__Builder) Remove(idx int64) error {
return err
}

func (nb *plainList__Builder) Append(values ...datamodel.Node) error {
func (nb *plainList__Builder) Append(values datamodel.Node) error {
// Passing an index equal to the length of the list will append the passed values to the end of the list
return nb.Insert(nb.Length(), values...)
return nb.Insert(nb.Length(), values)
}

func (nb *plainList__Builder) Insert(idx int64, values ...datamodel.Node) error {
func (nb *plainList__Builder) Insert(idx int64, values datamodel.Node) error {
var ps datamodel.PathSegment
if idx == nb.Length() {
ps = datamodel.PathSegmentOfString("-") // indicates appending to the end of the list
Expand All @@ -299,22 +299,7 @@ func (nb *plainList__Builder) Insert(idx int64, values ...datamodel.Node) error
_, err := nb.Transform(
datamodel.NewPath([]datamodel.PathSegment{ps}),
func(_ datamodel.Node) (datamodel.NodeAmender, error) {
// Put all the passed values into a new list. That will result in these values being expanded at the
// specified index.
na := nb.Prototype().NewBuilder()
la, err := na.BeginList(int64(len(values)))
if err != nil {
return nil, err
}
for _, v := range values {
if err := la.AssembleValue().AssignNode(v); err != nil {
return nil, err
}
}
if err := la.Finish(); err != nil {
return nil, err
}
return Prototype.Any.AmendingBuilder(na.Build()), nil
return Prototype.Any.AmendingBuilder(values), nil
},
)
return err
Expand All @@ -336,16 +321,8 @@ func (nb *plainList__Builder) Clear() {
nb.Reset()
}

func (nb *plainList__Builder) Values() ([]datamodel.Node, error) {
values := make([]datamodel.Node, 0, nb.Length())
for itr := nb.w.ListIterator(); !itr.Done(); {
_, v, err := itr.Next()
if err != nil {
return nil, err
}
values = append(values, v)
}
return values, nil
func (nb *plainList__Builder) Values() (datamodel.Node, error) {
return nb.Build(), nil
}

// -- NodeAssembler -->
Expand Down
72 changes: 42 additions & 30 deletions node/basicnode/map.go
Original file line number Diff line number Diff line change
Expand Up @@ -202,10 +202,7 @@ func (nb *plainMap__Builder) Transform(path datamodel.Path, transform datamodel.
if string(v.k) == childKey {
if newChildAmender == nil {
delete(nb.w.m, childKey)
newT := make([]plainMap__Entry, nb.w.Length()-1)
copy(newT, nb.w.t[:idx])
copy(newT[:idx], nb.w.t[idx+1:])
nb.w.t = newT
nb.w.t = append(nb.w.t[:idx], nb.w.t[idx+1:]...)
} else {
nb.w.t[idx].v = newChildAmender
nb.w.m[string(nb.w.t[idx].k)] = newChildAmender
Expand All @@ -219,27 +216,35 @@ func (nb *plainMap__Builder) Transform(path datamodel.Path, transform datamodel.
}
}

func (nb *plainMap__Builder) Put(key string, value datamodel.Node) (bool, error) {
if prevNode, err := nb.Transform(
datamodel.NewPath([]datamodel.PathSegment{datamodel.PathSegmentOfString(key)}),
func (nb *plainMap__Builder) Put(key datamodel.Node, value datamodel.Node) error {
ks, err := key.AsString()
if err != nil {
return err
}
if _, err := nb.Transform(
datamodel.NewPath([]datamodel.PathSegment{datamodel.PathSegmentOfString(ks)}),
func(_ datamodel.Node) (datamodel.NodeAmender, error) {
return Prototype.Any.AmendingBuilder(value), nil
},
); err != nil {
return false, err
return err
} else {
// If there was no previous node, we just added a new node.
return prevNode == nil, nil
return nil
}
}

func (nb *plainMap__Builder) Get(key string) (datamodel.Node, error) {
return nb.w.LookupByString(key)
func (nb *plainMap__Builder) Get(key datamodel.Node) (datamodel.Node, error) {
return nb.w.LookupByNode(key)
}

func (nb *plainMap__Builder) Remove(key string) (bool, error) {
func (nb *plainMap__Builder) Remove(key datamodel.Node) (bool, error) {
ks, err := key.AsString()
if err != nil {
return false, err
}
if prevNode, err := nb.Transform(
datamodel.NewPath([]datamodel.PathSegment{datamodel.PathSegmentOfString(key)}),
datamodel.NewPath([]datamodel.PathSegment{datamodel.PathSegmentOfString(ks)}),
func(_ datamodel.Node) (datamodel.NodeAmender, error) {
return nil, nil
},
Expand All @@ -251,20 +256,35 @@ func (nb *plainMap__Builder) Remove(key string) (bool, error) {
}
}

func (nb *plainMap__Builder) Keys() ([]string, error) {
keys := make([]string, 0, nb.Length())
func (nb *plainMap__Builder) Keys() (datamodel.Node, error) {
return nb.toList(true)
}

func (nb *plainMap__Builder) toList(keysOrValues bool) (datamodel.Node, error) {
// Create a new List node and initialize its storage
lb := Prototype.List.AmendingBuilder(nil)
_, err := lb.BeginList(nb.Length())
if err != nil {
return nil, err
}
var idx int64 = 0
for itr := nb.w.MapIterator(); !itr.Done(); {
k, _, err := itr.Next()
k, v, err := itr.Next()
if err != nil {
return nil, err
}
keyStr, err := k.AsString()
if err != nil {
var n datamodel.Node
if keysOrValues {
n = k
} else {
n = v
}
if err = lb.Set(idx, n); err != nil {
return nil, err
}
keys = append(keys, keyStr)
idx++
}
return keys, nil
return lb.Build(), nil
}

func (nb *plainMap__Builder) Empty() bool {
Expand All @@ -279,16 +299,8 @@ func (nb *plainMap__Builder) Clear() {
nb.Reset()
}

func (nb *plainMap__Builder) Values() ([]datamodel.Node, error) {
values := make([]datamodel.Node, 0, nb.Length())
for itr := nb.w.MapIterator(); !itr.Done(); {
_, v, err := itr.Next()
if err != nil {
return nil, err
}
values = append(values, v)
}
return values, nil
func (nb *plainMap__Builder) Values() (datamodel.Node, error) {
return nb.toList(false)
}

// -- NodeAssembler -->
Expand Down
Loading

0 comments on commit e3c116a

Please sign in to comment.