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  }