Sha256: e00228ac7cd2788ce5795ba1ac103cb24ffe91a9c0e2ecbcd08adae17ad2f2a1

Contents?: true

Size: 1.45 KB

Versions: 2

Compression:

Stored size: 1.45 KB

Contents

# frozen_string_literal: true

require "oj"
require "yaml"
require "basic_serializer/dsl"
require "basic_serializer/swagger"
require "basic_serializer/struct"
require "basic_serializer/config"
require "basic_serializer/hash"
class BasicSerializer
  extend DSL
  extend Swagger

  attr_reader :object

  def initialize(object)
    @object = object

    @object = @object.is_a?(::Hash) ? struct : @object

    remove_instance_variable(:@struct) if defined?(@struct)
  end

  def stringified_attributes
    hash.deep_stringify_keys
  end

  alias as_json stringified_attributes

  def to_json(*_args)
    pretty = self.class.instance_variable_get(:@format)&.dig(:pretty)

    Oj.dump(stringified_attributes, **(pretty ? Config::OJ_FORMAT : {}))
  end

  def to_yaml
    YAML.dump(stringified_attributes)
  end

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

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

  private

  def hash
    @hash ||= BasicSerializer::Hash.new

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

    @hash
  end

  def struct
    return @struct if @struct

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

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

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
basic_serializer-0.1.7 lib/basic_serializer.rb
basic_serializer-0.1.6 lib/basic_serializer.rb