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  }