module Crystalline::MetadataFields
def self.included(base)
def self.included(base) base.extend(ClassMethods) end
def field(field_name)
def field(field_name) fields.each do |f| return f if f.name == field_name end end
def fields
def fields self.class.fields end
def initialize
def initialize instance = allocate fields.each { |mod| instance.singleton_class.include(mod) } instance.send(:initialize) end
def marshal_single(field)
def marshal_single(field) if field.is_a? ::Crystalline::FieldAugmented field.to_dict else ::Crystalline.val_to_string(field, primitives: false) end end
def to_dict
def to_dict result = {} fields.sort_by(&:name).each do |field| f = send(field.name) next if f.nil? format_json_meta = field.metadata[:format_json] if !format_json_meta.nil? && format_json_meta.include?(:letter_case) key = format_json_meta[:letter_case].call(field.name) else key = field.name end if f.is_a? Array result[key] = f.map { |o| marshal_single(o) } elsif f.is_a? Hash result[key] = f.map { |k, v| [k, marshal_single(v)] } else result[key] = marshal_single(f) end end result end
def to_json(*args)
def to_json(*args) JSON.generate(to_dict, *args) end