Sha256: e415f7ded07be16758deccd253fbf3fe0e041ea804f6bb58027ac678a53d2d65

Contents?: true

Size: 1.51 KB

Versions: 2

Compression:

Stored size: 1.51 KB

Contents

require "json"

module Lutaml
  module Model
    module Schema
      class JsonSchema
        def self.generate(klass, options = {})
          schema = {
            "$schema" => "https://json-schema.org/draft/2020-12/schema",
            "$id" => options[:id],
            "description" => options[:description],
            "$ref" => "#/$defs/#{klass.name}",
            "$defs" => generate_definitions(klass),
          }.compact

          options[:pretty] ? JSON.pretty_generate(schema) : schema.to_json
        end

        def self.generate_definitions(klass)
          {
            klass.name => {
              "type" => "object",
              "properties" => generate_properties(klass),
              "required" => klass.attributes.keys,
            },
          }
        end

        def self.generate_properties(klass)
          klass.attributes.transform_values do |attr|
            generate_property_schema(attr)
          end
        end

        def self.generate_property_schema(attr)
          { "type" => get_json_type(attr.type) }
        end

        def self.get_json_type(type)
          {
            Lutaml::Model::Type::String => "string",
            Lutaml::Model::Type::Integer => "integer",
            Lutaml::Model::Type::Boolean => "boolean",
            Lutaml::Model::Type::Float => "number",
            Lutaml::Model::Type::Array => "array",
            Lutaml::Model::Type::Hash => "object",
          }[type] || "string" # Default to string for unknown types
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
lutaml-model-0.3.3 lib/lutaml/model/schema/json_schema.rb
lutaml-model-0.3.2 lib/lutaml/model/schema/json_schema.rb