literal: make Map and List generic, to avoid requiring conversions

This commit is contained in:
Michael Muré
2024-11-05 16:26:14 +01:00
parent 72f4ef7b5e
commit 6f9a6fa5c1

View File

@@ -31,7 +31,7 @@ func Null() ipld.Node {
} }
// Map creates an IPLD node from a map[string]any // Map creates an IPLD node from a map[string]any
func Map(m map[string]any) (ipld.Node, error) { func Map[T any](m map[string]T) (ipld.Node, error) {
return qp.BuildMap(basicnode.Prototype.Any, int64(len(m)), func(ma datamodel.MapAssembler) { return qp.BuildMap(basicnode.Prototype.Any, int64(len(m)), func(ma datamodel.MapAssembler) {
for k, v := range m { for k, v := range m {
qp.MapEntry(ma, k, anyAssemble(v)) qp.MapEntry(ma, k, anyAssemble(v))
@@ -39,6 +39,15 @@ func Map(m map[string]any) (ipld.Node, error) {
}) })
} }
// List creates an IPLD node from a []any
func List[T any](l []T) (ipld.Node, error) {
return qp.BuildList(basicnode.Prototype.Any, int64(len(l)), func(la datamodel.ListAssembler) {
for _, val := range l {
qp.ListEntry(la, anyAssemble(val))
}
})
}
func anyAssemble(val any) qp.Assemble { func anyAssemble(val any) qp.Assemble {
var rt reflect.Type var rt reflect.Type
var rv reflect.Value var rv reflect.Value