kind.go 1.99 KB
Newer Older
tavit ohanian's avatar
tavit ohanian committed
1
package ld
2

3
// Kind represents the primitive kind in the LD data model.
4 5
// All of these kinds map directly onto serializable data.
//
6
// Note that Kind contains the concept of "map", but not "struct"
7 8
// or "object" -- those are a concepts that could be introduced in a
// type system layers, but are *not* present in the data model layer,
9 10
// and therefore they aren't included in the Kind enum.
type Kind uint8
11 12

const (
13 14 15 16 17 18 19 20 21 22
	Kind_Invalid Kind = 0
	Kind_Map     Kind = '{'
	Kind_List    Kind = '['
	Kind_Null    Kind = '0'
	Kind_Bool    Kind = 'b'
	Kind_Int     Kind = 'i'
	Kind_Float   Kind = 'f'
	Kind_String  Kind = 's'
	Kind_Bytes   Kind = 'x'
	Kind_Link    Kind = '/'
23
)
Eric Myhre's avatar
Eric Myhre committed
24

25
func (k Kind) String() string {
Eric Myhre's avatar
Eric Myhre committed
26
	switch k {
27
	case Kind_Invalid:
28
		return "INVALID"
29
	case Kind_Map:
30
		return "map"
31
	case Kind_List:
32
		return "list"
33
	case Kind_Null:
34
		return "null"
35
	case Kind_Bool:
36
		return "bool"
37
	case Kind_Int:
38
		return "int"
39
	case Kind_Float:
40
		return "float"
41
	case Kind_String:
42
		return "string"
43
	case Kind_Bytes:
44
		return "bytes"
45
	case Kind_Link:
46
		return "link"
Eric Myhre's avatar
Eric Myhre committed
47 48 49 50
	default:
		panic("invalid enumeration value!")
	}
}
51

52
// KindSet is a type with a few enumerated consts that are commonly used
53
// (mostly, in error messages).
54
type KindSet []Kind
55 56

var (
57 58
	KindSet_Recursive = KindSet{Kind_Map, Kind_List}
	KindSet_Scalar    = KindSet{Kind_Null, Kind_Bool, Kind_Int, Kind_Float, Kind_String, Kind_Bytes, Kind_Link}
59

60 61 62 63 64 65 66 67 68
	KindSet_JustMap    = KindSet{Kind_Map}
	KindSet_JustList   = KindSet{Kind_List}
	KindSet_JustNull   = KindSet{Kind_Null}
	KindSet_JustBool   = KindSet{Kind_Bool}
	KindSet_JustInt    = KindSet{Kind_Int}
	KindSet_JustFloat  = KindSet{Kind_Float}
	KindSet_JustString = KindSet{Kind_String}
	KindSet_JustBytes  = KindSet{Kind_Bytes}
	KindSet_JustLink   = KindSet{Kind_Link}
69 70
)

71
func (x KindSet) String() string {
72 73 74 75 76 77 78
	s := ""
	for i := 0; i < len(x)-1; i++ {
		s += x[i].String() + " or "
	}
	s += x[len(x)-1].String()
	return s
}
79

80
func (x KindSet) Contains(e Kind) bool {
81 82 83 84 85 86 87
	for _, v := range x {
		if v == e {
			return true
		}
	}
	return false
}