Module: Crystalline::MetadataFields

Extended by:
T::Sig
Included in:
FieldAugmented
Defined in:
lib/crystalline/metadata_fields.rb

Defined Under Namespace

Modules: ClassMethods Classes: Field

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



112
113
114
# File 'lib/crystalline/metadata_fields.rb', line 112

def self.included(base)
  base.extend(ClassMethods)
end

Instance Method Details

#field(field_name) ⇒ Object



120
121
122
123
124
# File 'lib/crystalline/metadata_fields.rb', line 120

def field(field_name)
  fields.each do |f|
    return f if f.name == field_name
  end
end

#fieldsObject



116
117
118
# File 'lib/crystalline/metadata_fields.rb', line 116

def fields
  self.class.fields
end

#initializeObject



106
107
108
109
110
# File 'lib/crystalline/metadata_fields.rb', line 106

def initialize
  instance = allocate
  fields.each { |mod| instance.singleton_class.include(mod) }
  instance.send(:initialize)
end

#marshal_single(field) ⇒ Object



126
127
128
129
130
131
132
# File 'lib/crystalline/metadata_fields.rb', line 126

def marshal_single(field)
  if field.is_a? ::Crystalline::FieldAugmented
    field.to_dict
  else
    ::Crystalline.val_to_string(field, primitives: false)
  end
end

#to_dictObject



134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/crystalline/metadata_fields.rb', line 134

def to_dict
  result = {}
  fields.sort_by(&:name).each do |field|
    f = send(field.name)
    next if f.nil?

    format_json_meta = field.[: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

#to_json(*args) ⇒ Object



157
158
159
# File 'lib/crystalline/metadata_fields.rb', line 157

def to_json(*args)
  JSON.generate(to_dict, *args)
end