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.



147
148
149
150
151
152
153
154
155
156
# File 'lib/open_router/schema.rb', line 147

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



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

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

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



196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
# File 'lib/open_router/schema.rb', line 196

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



192
193
194
# File 'lib/open_router/schema.rb', line 192

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

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



184
185
186
# File 'lib/open_router/schema.rb', line 184

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

#no_additional_propertiesObject



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

def no_additional_properties
  additional_properties(false)
end

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



188
189
190
# File 'lib/open_router/schema.rb', line 188

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

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



212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
# File 'lib/open_router/schema.rb', line 212

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



171
172
173
174
175
176
177
178
# File 'lib/open_router/schema.rb', line 171

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



236
237
238
# File 'lib/open_router/schema.rb', line 236

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

#strict(value = true) ⇒ Object



158
159
160
161
# File 'lib/open_router/schema.rb', line 158

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

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



180
181
182
# File 'lib/open_router/schema.rb', line 180

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

#to_hObject



240
241
242
# File 'lib/open_router/schema.rb', line 240

def to_h
  @schema.dup
end