Class: TJSON::DataType
- Inherits:
-
Object
- Object
- TJSON::DataType
- 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
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
-
.[](tag) ⇒ Object
Find a type by its tag.
- .generate(obj) ⇒ Object
- .identify_type(obj) ⇒ Object
- .parse(tag) ⇒ Object
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
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 |