github.com/ipld/go-ipld-prime@v0.21.0/fluent/toInterfaceValue.go (about) 1 package fluent 2 3 import ( 4 "errors" 5 6 "github.com/ipld/go-ipld-prime/datamodel" 7 ) 8 9 var errInvalidKind = errors.New("invalid kind") 10 var errUnknownKind = errors.New("unknown kind") 11 12 // ToInterface converts an IPLD node to its simplest equivalent Go value. 13 // 14 // Booleans, integers, floats, strings, bytes, and links are returned as themselves, 15 // as per the node's AsT method. Note that nulls are returned as untyped nils. 16 // 17 // Lists and maps are returned as []interface{} and map[string]interface{}, respectively. 18 func ToInterface(node datamodel.Node) (interface{}, error) { 19 switch k := node.Kind(); k { 20 case datamodel.Kind_Invalid: 21 return nil, errInvalidKind 22 case datamodel.Kind_Null: 23 return nil, nil 24 case datamodel.Kind_Bool: 25 return node.AsBool() 26 case datamodel.Kind_Int: 27 return node.AsInt() 28 case datamodel.Kind_Float: 29 return node.AsFloat() 30 case datamodel.Kind_String: 31 return node.AsString() 32 case datamodel.Kind_Bytes: 33 return node.AsBytes() 34 case datamodel.Kind_Link: 35 return node.AsLink() 36 case datamodel.Kind_Map: 37 outMap := make(map[string]interface{}, node.Length()) 38 for mi := node.MapIterator(); !mi.Done(); { 39 k, v, err := mi.Next() 40 if err != nil { 41 return nil, err 42 } 43 kVal, err := k.AsString() 44 if err != nil { 45 return nil, err 46 } 47 vVal, err := ToInterface(v) 48 if err != nil { 49 return nil, err 50 } 51 outMap[kVal] = vVal 52 } 53 return outMap, nil 54 case datamodel.Kind_List: 55 outList := make([]interface{}, 0, node.Length()) 56 for li := node.ListIterator(); !li.Done(); { 57 _, v, err := li.Next() 58 if err != nil { 59 return nil, err 60 } 61 vVal, err := ToInterface(v) 62 if err != nil { 63 return nil, err 64 } 65 outList = append(outList, vVal) 66 } 67 return outList, nil 68 default: 69 return nil, errUnknownKind 70 } 71 }