Sha256: 0ba681aa48a2081e2867780a53c89129ee4dd8aaf413d9c6ed9b4488e4107027

Contents?: true

Size: 1.45 KB

Versions: 1

Compression:

Stored size: 1.45 KB

Contents

# frozen_string_literal: true

require 'forwardable'
require_relative 'errors'
require_relative 'json_schema/schemas'

module Meta
  class Entity
    class << self
      extend Forwardable

      attr_reader :schema_builder

      def inherited(base)
        base.instance_eval do
          @schema_builder = JsonSchema::ObjectSchemaBuilder.new
          @schema_builder.schema_name(self.name) if self.name
        end
      end

      def_delegators :schema_builder, :property, :param, :expose, :use, :lock, :locked, :schema_name, :to_schema

      def method_missing(method, *args)
        if method =~ /^lock_(\w+)$/
          schema_builder.send(method, *args)
        else
          super
        end
      end

      private

      # TODO: 不需要在 Entity 内自动生成名称了,交给 ObjectSchema::Naming 去做吧
      def generate_schema_name(stage, locked_scopes)
        # 匿名类不考虑自动生成名称
        return nil unless self.name

        schema_name = self.name.gsub('::', '_')
        schema_name = schema_name.delete_suffix('Entity') unless schema_name == 'Entity'

        # 先考虑 stage
        case stage
        when :param
          schema_name += 'Params'
        when :render
          schema_name += 'Entity'
        end

        # 再考虑 locked_scope
        scope_suffix = locked_scopes.join('_')
        schema_name = "#{schema_name}_#{scope_suffix}" unless scope_suffix.empty?

        schema_name
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
meta-api-0.1.0 lib//meta/entity.rb