lib/grumlin/typing.rb in grumlin-0.23.0 vs lib/grumlin/typing.rb in grumlin-1.0.0.rc1

- old
+ new

@@ -1,90 +1,88 @@ # frozen_string_literal: true -module Grumlin - module Typing - TYPES = { - "g:List" => ->(value) { cast_list(value) }, - "g:Set" => ->(value) { cast_list(value).to_set }, - "g:Map" => ->(value) { cast_map(value) }, - "g:Vertex" => ->(value) { cast_entity(Grumlin::Vertex, value) }, - "g:Edge" => ->(value) { cast_entity(Grumlin::Edge, value) }, - "g:Path" => ->(value) { cast_entity(Grumlin::Path, value) }, - "g:Traverser" => ->(value) { cast_entity(Grumlin::Traverser, value) }, - "g:Property" => ->(value) { cast_entity(Grumlin::Property, value) }, - "g:Int64" => ->(value) { cast_int(value) }, - "g:Int32" => ->(value) { cast_int(value) }, - "g:Double" => ->(value) { cast_double(value) }, - "g:Direction" => ->(value) { value }, - "g:VertexProperty" => ->(value) { cast_entity(Grumlin::VertexProperty, value) }, - "g:TraversalMetrics" => ->(value) { cast_map(value[:@value]) }, - "g:Metrics" => ->(value) { cast_map(value[:@value]) }, - "g:T" => ->(value) { Grumlin::Expressions::T.public_send(value) } - }.freeze +module Grumlin::Typing + TYPES = { + "g:List" => ->(value) { cast_list(value) }, + "g:Set" => ->(value) { cast_list(value).to_set }, + "g:Map" => ->(value) { cast_map(value) }, + "g:Vertex" => ->(value) { cast_entity(Grumlin::Vertex, value) }, + "g:Edge" => ->(value) { cast_entity(Grumlin::Edge, value) }, + "g:Path" => ->(value) { cast_entity(Grumlin::Path, value) }, + "g:Traverser" => ->(value) { cast_entity(Grumlin::Traverser, value) }, + "g:Property" => ->(value) { cast_entity(Grumlin::Property, value) }, + "g:Int64" => ->(value) { cast_int(value) }, + "g:Int32" => ->(value) { cast_int(value) }, + "g:Double" => ->(value) { cast_double(value) }, + "g:Direction" => ->(value) { value }, + "g:VertexProperty" => ->(value) { cast_entity(Grumlin::VertexProperty, value) }, + "g:TraversalMetrics" => ->(value) { cast_map(value[:@value]) }, + "g:Metrics" => ->(value) { cast_map(value[:@value]) }, + "g:T" => ->(value) { Grumlin::Expressions::T.public_send(value) } + }.freeze - CASTABLE_TYPES = [Hash, String, Integer, TrueClass, FalseClass, NilClass].freeze + CASTABLE_TYPES = [Hash, String, Integer, TrueClass, FalseClass, NilClass].freeze - class << self - def cast(value) - verify_type!(value) + class << self + def cast(value) + verify_type!(value) - return value unless value.is_a?(Hash) + return value unless value.is_a?(Hash) - type = TYPES[value[:@type]] + type = TYPES[value[:@type]] - verify_castable_hash!(value, type) + verify_castable_hash!(value, type) - type.call(value[:@value]) - end + type.call(value[:@value]) + end - private + private - def verify_type!(value) - raise TypeError, "#{value.inspect} cannot be casted" unless CASTABLE_TYPES.include?(value.class) - end + def verify_type!(value) + raise TypeError, "#{value.inspect} cannot be casted" unless CASTABLE_TYPES.include?(value.class) + end - def verify_castable_hash!(value, type) - raise TypeError, "#{value} cannot be casted, @type is missing" if value[:@type].nil? - raise(UnknownTypeError, value[:@type]) if type.nil? - raise TypeError, "#{value} cannot be casted, @value is missing" if value[:@value].nil? - end + def verify_castable_hash!(value, type) + raise TypeError, "#{value} cannot be casted, @type is missing" if value[:@type].nil? + raise(UnknownTypeError, value[:@type]) if type.nil? + raise TypeError, "#{value} cannot be casted, @value is missing" if value[:@value].nil? + end - def cast_int(value) - raise TypeError, "#{value} is not an Integer" unless value.is_a?(Integer) + def cast_int(value) + raise TypeError, "#{value} is not an Integer" unless value.is_a?(Integer) - value - end + value + end - def cast_double(value) - raise TypeError, "#{value} is not a Double" unless value.is_a?(Float) + def cast_double(value) + raise TypeError, "#{value} is not a Double" unless value.is_a?(Float) - value - end + value + end - def cast_entity(entity, value) - entity.new(**value) - rescue ArgumentError, TypeError - raise TypeError, "#{value} cannot be casted to #{entity.name}" - end + def cast_entity(entity, value) + entity.new(**value) + rescue ArgumentError, TypeError + raise TypeError, "#{value} cannot be casted to #{entity.name}" + end - def cast_map(value) - Hash[*value].transform_keys do |key| - next key.to_sym if key.respond_to?(:to_sym) - next cast(key) if key[:@type] # TODO: g.V.group.by(:none_existing_property).next + def cast_map(value) + Hash[*value].transform_keys do |key| + next key.to_sym if key.respond_to?(:to_sym) + next cast(key) if key[:@type] # TODO: g.V.group.by(:none_existing_property).next - raise UnknownMapKey, key, value - end.transform_values { |v| cast(v) } - rescue ArgumentError - raise TypeError, "#{value} cannot be casted to Hash" - end + raise UnknownMapKey, key, value + end.transform_values { |v| cast(v) } + rescue ArgumentError + raise TypeError, "#{value} cannot be casted to Hash" + end - def cast_list(value) - value.each_with_object([]) do |item, result| - casted_value = cast(item) - next (result << casted_value) unless casted_value.instance_of?(Traverser) + def cast_list(value) + value.each_with_object([]) do |item, result| + casted_value = cast(item) + next (result << casted_value) unless casted_value.instance_of?(Grumlin::Traverser) - casted_value.bulk.times { result << casted_value.value } - end + casted_value.bulk.times { result << casted_value.value } end end end end