Class: OpenRouter::Schema::SchemaBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/open_router/schema.rb

Overview

Internal class for building schemas with DSL

Instance Method Summary collapse

Constructor Details

#initializeSchemaBuilder

Returns a new instance of SchemaBuilder.



131
132
133
134
135
136
137
138
139
140
# File 'lib/open_router/schema.rb', line 131

def initialize
  @schema = {
    type: "object",
    properties: {},
    required: []
  }
  @strict_mode = true
  # Set additionalProperties to false by default in strict mode
  @schema[:additionalProperties] = false
end

Instance Method Details

#additional_properties(allowed = true) ⇒ Object



147
148
149
# File 'lib/open_router/schema.rb', line 147

def additional_properties(allowed = true)
  @schema[:additionalProperties] = allowed
end

#array(name, required: false, description: nil, items: nil, &block) ⇒ Object



180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# File 'lib/open_router/schema.rb', line 180

def array(name, required: false, description: nil, items: nil, &block)
  array_def = { type: "array" }
  array_def[:description] = description if description

  if items
    array_def[:items] = items
  elsif block_given?
    items_builder = ItemsBuilder.new
    items_builder.instance_eval(&block)
    array_def[:items] = items_builder.to_h
  end

  @schema[:properties][name] = array_def
  mark_required(name) if required
end

#boolean(name, required: false, description: nil, **options) ⇒ Object



176
177
178
# File 'lib/open_router/schema.rb', line 176

def boolean(name, required: false, description: nil, **options)
  property(name, :boolean, required:, description:, **options)
end

#integer(name, required: false, description: nil, **options) ⇒ Object



168
169
170
# File 'lib/open_router/schema.rb', line 168

def integer(name, required: false, description: nil, **options)
  property(name, :integer, required:, description:, **options)
end

#no_additional_propertiesObject



151
152
153
# File 'lib/open_router/schema.rb', line 151

def no_additional_properties
  additional_properties(false)
end

#number(name, required: false, description: nil, **options) ⇒ Object



172
173
174
# File 'lib/open_router/schema.rb', line 172

def number(name, required: false, description: nil, **options)
  property(name, :number, required:, description:, **options)
end

#object(name, required: false, description: nil, &block) ⇒ Object



196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
# File 'lib/open_router/schema.rb', line 196

def object(name, required: false, description: nil, &block)
  object_def = {
    type: "object",
    properties: {},
    required: []
  }
  object_def[:description] = description if description

  if block_given?
    object_builder = SchemaBuilder.new
    object_builder.instance_eval(&block)
    nested_schema = object_builder.to_h
    object_def[:properties] = nested_schema[:properties]
    object_def[:required] = nested_schema[:required]
    if nested_schema.key?(:additionalProperties)
      object_def[:additionalProperties] =
        nested_schema[:additionalProperties]
    end
  end

  @schema[:properties][name] = object_def
  mark_required(name) if required
end

#property(name, type, required: false, description: nil, **options) ⇒ Object



155
156
157
158
159
160
161
162
# File 'lib/open_router/schema.rb', line 155

def property(name, type, required: false, description: nil, **options)
  prop_def = { type: type.to_s }
  prop_def[:description] = description if description
  prop_def.merge!(options)

  @schema[:properties][name] = prop_def
  mark_required(name) if required
end

#required(*field_names) ⇒ Object



220
221
222
# File 'lib/open_router/schema.rb', line 220

def required(*field_names)
  field_names.each { |name| mark_required(name) }
end

#strict(value = true) ⇒ Object



142
143
144
145
# File 'lib/open_router/schema.rb', line 142

def strict(value = true)
  @strict_mode = value
  additional_properties(!value)
end

#string(name, required: false, description: nil, **options) ⇒ Object



164
165
166
# File 'lib/open_router/schema.rb', line 164

def string(name, required: false, description: nil, **options)
  property(name, :string, required:, description:, **options)
end

#to_hObject



224
225
226
# File 'lib/open_router/schema.rb', line 224

def to_h
  @schema.dup
end