Sha256: 3160552b08fe7e3f5e64415c8e1c20c919f2a3f7652dd15acc86e274c729a365

Contents?: true

Size: 1.9 KB

Versions: 1

Compression:

Stored size: 1.9 KB

Contents

# frozen_string_literal: true

module Cocina
  module Generator
    # Base class for generating from openapi
    class SchemaBase
      attr_reader :schema_doc, :key, :required, :nullable, :parent

      def initialize(schema_doc, key: nil, required: false, nullable: false, parent: nil)
        @schema_doc = schema_doc
        @key = key
        @required = required
        @nullable = nullable
        @parent = parent
      end

      def filename
        "#{name.underscore}.rb"
      end

      def name
        key || schema_doc.name
      end

      # Allows non-required values to not be provided. This allows smaller
      # requests as not every field needs to be present.
      def omittable
        return '' if required

        '.meta(omittable: true)'
      end

      # Allows nillable values to be set to nil. This is useful when doing
      # an update and you want to clear out a value.
      def optional
        nullable ? '.optional' : ''
      end

      def quote(item)
        return item unless schema_doc.type == 'string'

        "'#{item}'"
      end

      def description
        return '' unless schema_doc.description

        "# #{schema_doc.description}\n"
      end

      def example
        return '' unless schema_doc.example

        "# example: #{schema_doc.example}\n"
      end

      def dry_datatype(doc)
        case doc.type
        when 'integer'
          'Strict::Integer'
        when 'string'
          string_dry_datatype(doc)
        when 'boolean'
          'Strict::Bool'
        else
          if doc.one_of&.map(&:type).all? { |o| %w[integer string].include?(o) }
            'Nominal::Any'
          else
            raise "#{schema_doc.type} not supported"
          end
        end
      end

      def string_dry_datatype(doc)
        case doc.format
        when 'date-time'
          'Params::DateTime'
        else
          'Strict::String'
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
cocina-models-0.58.2 lib/cocina/generator/schema_base.rb