module DingSDK::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_json(encode: true)
def marshal_json(encode: true) d = {} 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 d[key] = f.map { |o| marshal_single(o) } elsif f.is_a? Hash d[key] = f.map { |k, v| [k, marshal_single(v)] } else d[key] = marshal_single(f) end end if encode JSON.dump(d) else d end end
def marshal_single(field)
def marshal_single(field) if field.respond_to? :marshal_json field.marshal_json(encode: false) else Utils.val_to_string(field, primitives: false) end end