github.com/ipld/go-ipld-prime@v0.21.0/node/basicnode/int.go (about) 1 package basicnode 2 3 import ( 4 "fmt" 5 "math" 6 7 "github.com/ipld/go-ipld-prime/datamodel" 8 "github.com/ipld/go-ipld-prime/node/mixins" 9 ) 10 11 var ( 12 _ datamodel.Node = plainInt(0) 13 _ datamodel.Node = plainUint(0) 14 _ datamodel.UintNode = plainUint(0) 15 _ datamodel.NodePrototype = Prototype__Int{} 16 _ datamodel.NodeBuilder = &plainInt__Builder{} 17 _ datamodel.NodeAssembler = &plainInt__Assembler{} 18 ) 19 20 func NewInt(value int64) datamodel.Node { 21 v := plainInt(value) 22 return &v 23 } 24 25 // NewUint creates a new uint64-backed Node which will behave as a plain Int 26 // node but also conforms to the datamodel.UintNode interface which can access 27 // the full uint64 range. 28 // 29 // EXPERIMENTAL: this API is experimental and may be changed or removed in a 30 // future release. 31 func NewUint(value uint64) datamodel.Node { 32 return plainUint(value) 33 } 34 35 // plainInt is a simple boxed int that complies with datamodel.Node. 36 type plainInt int64 37 38 // -- Node interface methods for plainInt --> 39 40 func (plainInt) Kind() datamodel.Kind { 41 return datamodel.Kind_Int 42 } 43 func (plainInt) LookupByString(string) (datamodel.Node, error) { 44 return mixins.Int{TypeName: "int"}.LookupByString("") 45 } 46 func (plainInt) LookupByNode(key datamodel.Node) (datamodel.Node, error) { 47 return mixins.Int{TypeName: "int"}.LookupByNode(nil) 48 } 49 func (plainInt) LookupByIndex(idx int64) (datamodel.Node, error) { 50 return mixins.Int{TypeName: "int"}.LookupByIndex(0) 51 } 52 func (plainInt) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { 53 return mixins.Int{TypeName: "int"}.LookupBySegment(seg) 54 } 55 func (plainInt) MapIterator() datamodel.MapIterator { 56 return nil 57 } 58 func (plainInt) ListIterator() datamodel.ListIterator { 59 return nil 60 } 61 func (plainInt) Length() int64 { 62 return -1 63 } 64 func (plainInt) IsAbsent() bool { 65 return false 66 } 67 func (plainInt) IsNull() bool { 68 return false 69 } 70 func (plainInt) AsBool() (bool, error) { 71 return mixins.Int{TypeName: "int"}.AsBool() 72 } 73 func (n plainInt) AsInt() (int64, error) { 74 return int64(n), nil 75 } 76 func (plainInt) AsFloat() (float64, error) { 77 return mixins.Int{TypeName: "int"}.AsFloat() 78 } 79 func (plainInt) AsString() (string, error) { 80 return mixins.Int{TypeName: "int"}.AsString() 81 } 82 func (plainInt) AsBytes() ([]byte, error) { 83 return mixins.Int{TypeName: "int"}.AsBytes() 84 } 85 func (plainInt) AsLink() (datamodel.Link, error) { 86 return mixins.Int{TypeName: "int"}.AsLink() 87 } 88 func (plainInt) Prototype() datamodel.NodePrototype { 89 return Prototype__Int{} 90 } 91 92 // plainUint is a simple boxed uint64 that complies with datamodel.Node, 93 // allowing representation of the uint64 range above the int64 maximum via the 94 // UintNode interface 95 type plainUint uint64 96 97 // -- Node interface methods for plainUint --> 98 99 func (plainUint) Kind() datamodel.Kind { 100 return datamodel.Kind_Int 101 } 102 func (plainUint) LookupByString(string) (datamodel.Node, error) { 103 return mixins.Int{TypeName: "int"}.LookupByString("") 104 } 105 func (plainUint) LookupByNode(key datamodel.Node) (datamodel.Node, error) { 106 return mixins.Int{TypeName: "int"}.LookupByNode(nil) 107 } 108 func (plainUint) LookupByIndex(idx int64) (datamodel.Node, error) { 109 return mixins.Int{TypeName: "int"}.LookupByIndex(0) 110 } 111 func (plainUint) LookupBySegment(seg datamodel.PathSegment) (datamodel.Node, error) { 112 return mixins.Int{TypeName: "int"}.LookupBySegment(seg) 113 } 114 func (plainUint) MapIterator() datamodel.MapIterator { 115 return nil 116 } 117 func (plainUint) ListIterator() datamodel.ListIterator { 118 return nil 119 } 120 func (plainUint) Length() int64 { 121 return -1 122 } 123 func (plainUint) IsAbsent() bool { 124 return false 125 } 126 func (plainUint) IsNull() bool { 127 return false 128 } 129 func (plainUint) AsBool() (bool, error) { 130 return mixins.Int{TypeName: "int"}.AsBool() 131 } 132 func (n plainUint) AsInt() (int64, error) { 133 if uint64(n) > uint64(math.MaxInt64) { 134 return -1, fmt.Errorf("unsigned integer out of range of int64 type") 135 } 136 return int64(n), nil 137 } 138 func (plainUint) AsFloat() (float64, error) { 139 return mixins.Int{TypeName: "int"}.AsFloat() 140 } 141 func (plainUint) AsString() (string, error) { 142 return mixins.Int{TypeName: "int"}.AsString() 143 } 144 func (plainUint) AsBytes() ([]byte, error) { 145 return mixins.Int{TypeName: "int"}.AsBytes() 146 } 147 func (plainUint) AsLink() (datamodel.Link, error) { 148 return mixins.Int{TypeName: "int"}.AsLink() 149 } 150 func (plainUint) Prototype() datamodel.NodePrototype { 151 return Prototype__Int{} 152 } 153 154 // allows plainUint to conform to the plainUint interface 155 156 func (n plainUint) AsUint() (uint64, error) { 157 return uint64(n), nil 158 } 159 160 // -- NodePrototype --> 161 162 type Prototype__Int struct{} 163 164 func (Prototype__Int) NewBuilder() datamodel.NodeBuilder { 165 var w plainInt 166 return &plainInt__Builder{plainInt__Assembler{w: &w}} 167 } 168 169 // -- NodeBuilder --> 170 171 type plainInt__Builder struct { 172 plainInt__Assembler 173 } 174 175 func (nb *plainInt__Builder) Build() datamodel.Node { 176 return nb.w 177 } 178 func (nb *plainInt__Builder) Reset() { 179 var w plainInt 180 *nb = plainInt__Builder{plainInt__Assembler{w: &w}} 181 } 182 183 // -- NodeAssembler --> 184 185 type plainInt__Assembler struct { 186 w *plainInt 187 } 188 189 func (plainInt__Assembler) BeginMap(sizeHint int64) (datamodel.MapAssembler, error) { 190 return mixins.IntAssembler{TypeName: "int"}.BeginMap(0) 191 } 192 func (plainInt__Assembler) BeginList(sizeHint int64) (datamodel.ListAssembler, error) { 193 return mixins.IntAssembler{TypeName: "int"}.BeginList(0) 194 } 195 func (plainInt__Assembler) AssignNull() error { 196 return mixins.IntAssembler{TypeName: "int"}.AssignNull() 197 } 198 func (plainInt__Assembler) AssignBool(bool) error { 199 return mixins.IntAssembler{TypeName: "int"}.AssignBool(false) 200 } 201 func (na *plainInt__Assembler) AssignInt(v int64) error { 202 *na.w = plainInt(v) 203 return nil 204 } 205 func (plainInt__Assembler) AssignFloat(float64) error { 206 return mixins.IntAssembler{TypeName: "int"}.AssignFloat(0) 207 } 208 func (plainInt__Assembler) AssignString(string) error { 209 return mixins.IntAssembler{TypeName: "int"}.AssignString("") 210 } 211 func (plainInt__Assembler) AssignBytes([]byte) error { 212 return mixins.IntAssembler{TypeName: "int"}.AssignBytes(nil) 213 } 214 func (plainInt__Assembler) AssignLink(datamodel.Link) error { 215 return mixins.IntAssembler{TypeName: "int"}.AssignLink(nil) 216 } 217 func (na *plainInt__Assembler) AssignNode(v datamodel.Node) error { 218 if v2, err := v.AsInt(); err != nil { 219 return err 220 } else { 221 *na.w = plainInt(v2) 222 return nil 223 } 224 } 225 func (plainInt__Assembler) Prototype() datamodel.NodePrototype { 226 return Prototype__Int{} 227 }