# Copyright 2022 Mattia Giambirtone & All Contributors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import strformat import strutils type ObjectKind* = enum ## Enumeration of Peon ## types Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Float32, Float64, Char, Byte, String, Function, CustomType, Nil, Nan, Bool, Inf, Reference, Pointer PeonObject* = object ## A generic Peon object case kind*: ObjectKind: of String: str*: string of Bool: boolean*: bool of Inf: positive*: bool of Byte: `byte`*: byte of Int8: tiny*: int8 of UInt8: uTiny*: uint8 of Int16: short*: int16 of UInt16: uShort*: uint16 of Int32: `int`*: int32 of UInt32: uInt*: uint32 of Int64: long*: int64 of UInt64: uLong*: uint64 of Nil, Nan: discard of CustomType: fields*: seq[PeonObject] of Float32: halfFloat*: float32 of Float64: `float`*: float of Function: ip*: uint32 of Reference, Pointer: value*: ptr PeonObject else: discard # TODO proc `$`*(self: PeonObject): string = ## Returns a string representation ## of a peon object case self.kind: of Int64: result = &"{self.long}'i64" of UInt64: result = &"{self.uLong}'u64" of Int32: result = &"{self.`int`}'i32" of UInt32: result = &"{self.uInt}'u32" of Int16: result = &"{self.short}'i16" of UInt16: result = &"{self.uShort}'u16" of Int8: result = &"{self.tiny}'i8" of UInt8: result = &"{self.uTiny}'u8" of Float32: result = &"{self.halfFloat}'f32" of Float64: result = &"{self.`float`}'f64" of ObjectKind.Inf: if self.positive: result ="inf" else: result ="-inf" of ObjectKind.Nan, Nil: result =($self.kind).toLowerAscii() of Function: result = &"fn(ip: {self.ip})" of CustomType: result = "typevar" of String: result = self.str of Bool: if self.boolean: result = "true" else: result = "false" else: discard