Sha256: dde9479d4a3589b671ab52f760d2223a780b46464ff722c8a5c4f4e3562840b1

Contents?: true

Size: 1.72 KB

Versions: 1

Compression:

Stored size: 1.72 KB

Contents

# frozen_string_literal: true

require "oj"
require "yaml"
require "basic_serializer/dsl"

BasicStruct = Class.new(Struct)

class BasicSerializer
  extend DSL

  attr_reader :object

  def initialize(object)
    @object = object.is_a?(Hash) ? struct(object) : object
    remove_instance_variable(:@struct) if defined?(@struct)
  end

  def stringified_attributes
    hash = {}

    self.class.attributes.each_key do |attr_name|
      hash[attr_name] = send(attr_name)
    end

    deep_stringify_keys(hash)
  end

  alias as_json stringified_attributes

  def to_json(*_args)
    Oj.dump(stringified_attributes)
  end

  def to_yaml
    YAML.dump(stringified_attributes)
  end

  def serialize
    case self.class.instance_variable_get(:@format)
    when :json then to_json
    when :yaml then to_yaml
    else stringified_attributes
    end
  end

  def self.swagger_ref
    @schema_ref || "#/components/schemas/#{custom_model_name}"
  end

  def self.swagger_schema
    hash = {
      type: "object",
      properties: {}
    }

    attributes.each_pair do |name, type|
      hash[:properties][name] = { type: type }
    end

    hash
  end

  singleton_class.alias_method :openapi_ref, :swagger_ref
  singleton_class.alias_method :openapi_schema, :swagger_schema

  private

  def deep_stringify_keys(hash)
    hash.transform_keys(&:to_s).transform_values do |value|
      case value
      when Hash then deep_stringify_keys(value)
      when Array then value.map { |item| item.is_a?(Hash) ? deep_stringify_keys(item) : item }
      else value
      end
    end
  end

  def struct(object)
    return @struct if @struct

    basic_struct ||= BasicStruct.new(*object.keys.map(&:to_sym), keyword_init: true)

    @struct ||= basic_struct.new(**object)
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
basic_serializer-0.1.2 lib/basic_serializer.rb