kind.go 2.66 KB
Newer Older
1 2
package schema

3 4 5 6
import (
	ipld "github.com/ipld/go-ipld-prime"
)

7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
// Kind is an enum of kind in the IPLD Schema system.
//
// Note that schema.Kind is distinct from ipld.ReprKind!
// Schema kinds include concepts such as "struct" and "enum", which are
// concepts only introduced by the Schema layer, and not present in the
// Data Model layer.
type Kind uint8

const (
	Kind_Invalid Kind = 0
	Kind_Map     Kind = '{'
	Kind_List    Kind = '['
	Kind_Unit    Kind = '1'
	Kind_Bool    Kind = 'b'
	Kind_Int     Kind = 'i'
	Kind_Float   Kind = 'f'
	Kind_String  Kind = 's'
	Kind_Bytes   Kind = 'x'
	Kind_Link    Kind = '/'
	Kind_Struct  Kind = '$'
27
	Kind_Union   Kind = '^'
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
	Kind_Enum    Kind = '%'
	// FUTURE: Kind_Any = '?'?
)

func (k Kind) String() string {
	switch k {
	case Kind_Invalid:
		return "Invalid"
	case Kind_Map:
		return "Map"
	case Kind_List:
		return "List"
	case Kind_Unit:
		return "Unit"
	case Kind_Bool:
		return "Bool"
	case Kind_Int:
		return "Int"
	case Kind_Float:
		return "Float"
	case Kind_String:
		return "String"
	case Kind_Bytes:
		return "Bytes"
	case Kind_Link:
		return "Link"
	case Kind_Struct:
		return "Struct"
56 57
	case Kind_Union:
		return "Union"
58 59 60 61 62 63
	case Kind_Enum:
		return "Enum"
	default:
		panic("invalid enumeration value!")
	}
}
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108

// ActsLike returns a constant from the ipld.ReprKind enum describing what
// this schema.Kind acts like at the Data Model layer.
//
// Things with similar names are generally conserved
// (e.g. "map" acts like "map");
// concepts added by the schema layer have to be mapped onto something
// (e.g. "struct" acts like "map").
//
// Note that this mapping describes how a typed Node will *act*, programmatically;
// it does not necessarily describe how it will be *serialized*
// (for example, a struct will always act like a map, even if it has a tuple
// representation strategy and thus becomes a list when serialized).
func (k Kind) ActsLike() ipld.ReprKind {
	switch k {
	case Kind_Invalid:
		return ipld.ReprKind_Invalid
	case Kind_Map:
		return ipld.ReprKind_Map
	case Kind_List:
		return ipld.ReprKind_List
	case Kind_Unit:
		return ipld.ReprKind_Bool // maps to 'true'.
	case Kind_Bool:
		return ipld.ReprKind_Bool
	case Kind_Int:
		return ipld.ReprKind_Int
	case Kind_Float:
		return ipld.ReprKind_Float
	case Kind_String:
		return ipld.ReprKind_String
	case Kind_Bytes:
		return ipld.ReprKind_Bytes
	case Kind_Link:
		return ipld.ReprKind_Link
	case Kind_Struct:
		return ipld.ReprKind_Map // clear enough: fields are keys.
	case Kind_Union:
		return ipld.ReprKind_Map // REVIEW: unions are tricky.
	case Kind_Enum:
		return ipld.ReprKind_String // 'AsString' is the one clear thing to define.
	default:
		panic("invalid enumeration value!")
	}
}