Class: TJSON::DataType

Inherits:
Object
  • Object
show all
Defined in:
lib/tjson/datatype.rb,
lib/tjson/datatype/array.rb,
lib/tjson/datatype/float.rb,
lib/tjson/datatype/binary.rb,
lib/tjson/datatype/object.rb,
lib/tjson/datatype/string.rb,
lib/tjson/datatype/integer.rb,
lib/tjson/datatype/timestamp.rb

Overview

Hierarchy of TJSON types

Direct Known Subclasses

NonScalar, Scalar

Defined Under Namespace

Classes: Array, Binary, Binary16, Binary32, Binary64, Float, Integer, NonScalar, Number, Object, Scalar, SignedInt, String, Timestamp, UnsignedInt

Constant Summary collapse

TAGS =

TJSON does not presently support user-extensible types

{
  # Object (non-scalar with self-describing types)
  "O" => TJSON::DataType::Object.new(nil).freeze,

  # Non-scalars
  "A" => TJSON::DataType::Array,

  # Scalars
  "b"   => TJSON::DataType::Binary64.new.freeze,
  "b16" => TJSON::DataType::Binary16.new.freeze,
  "b32" => TJSON::DataType::Binary32.new.freeze,
  "b64" => TJSON::DataType::Binary64.new.freeze,
  "f"   => TJSON::DataType::Float.new.freeze,
  "i"   => TJSON::DataType::SignedInt.new.freeze,
  "s"   => TJSON::DataType::String.new.freeze,
  "t"   => TJSON::DataType::Timestamp.new.freeze,
  "u"   => TJSON::DataType::UnsignedInt.new.freeze
}.freeze

Class Method Summary collapse

Class Method Details

.[](tag) ⇒ Object

Find a type by its tag



7
8
9
# File 'lib/tjson/datatype.rb', line 7

def self.[](tag)
  TAGS[tag] || raise(TJSON::TypeError, "unknown tag: #{tag.inspect}")
end

.generate(obj) ⇒ Object



41
42
43
# File 'lib/tjson/datatype.rb', line 41

def self.generate(obj)
  identify_type(obj).generate(obj)
end

.identify_type(obj) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
# File 'lib/tjson/datatype.rb', line 29

def self.identify_type(obj)
  case obj
  when Hash               then self["O"]
  when ::Array            then TJSON::DataType::Array.identify_type(obj)
  when ::String, Symbol   then obj.encoding == Encoding::BINARY ? self["b"] : self["s"]
  when ::Integer          then self["i"]
  when ::Float            then self["f"]
  when ::Time, ::DateTime then self["t"]
  else raise TypeError, "don't know how to serialize #{obj.class} as TJSON"
  end
end

.parse(tag) ⇒ Object

Raises:



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/tjson/datatype.rb', line 11

def self.parse(tag)
  raise TJSON::TypeError, "expected String, got #{tag.class}" unless tag.is_a?(::String)

  if tag == "O"
    # Object
    TJSON::DataType[tag]
  elsif (result = tag.match(/\A(?<type>[A-Z][a-z0-9]*)\<(?<inner>.*)\>\z/))
    # Non-scalar
    inner = parse(result[:inner]) unless result[:inner].empty?
    TJSON::DataType[result[:type]].new(inner).freeze
  elsif tag =~ /\A[a-z][a-z0-9]*\z/
    # Scalar
    TJSON::DataType[tag]
  else
    raise TJSON::ParseError, "couldn't parse tag: #{tag.inspect}" unless result
  end
end