Class: DSPy::TypeSerializer

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/dspy/type_serializer.rb

Class Method Summary collapse

Class Method Details

.serialize(value) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/dspy/type_serializer.rb', line 11

def self.serialize(value)
  case value
  when T::Struct
    serialize_struct(value)
  when Array
    value.map { |item| serialize(item) }
  when Hash
    value.transform_values { |v| serialize(v) }
  else
    return serialize(value.serialize) if value.respond_to?(:serialize)
    value
  end
end

.serialize_struct(struct) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/dspy/type_serializer.rb', line 28

def self.serialize_struct(struct)
  # Handle anonymous structs that don't have a name
  class_name = struct.class.name
  type_name = if class_name.nil? || class_name.empty?
    # For anonymous structs, use a generic identifier
    "AnonymousStruct"
  else
    class_name.split('::').last
  end
  
  result = {
    "_type" => type_name
  }

  # Get all props and serialize their values
  struct.class.props.each do |prop_name, prop_info|
    prop_value = struct.send(prop_name)
    
    # Skip nil values for optional fields
    next if prop_value.nil? && prop_info[:fully_optional]
    
    # Recursively serialize nested values
    result[prop_name.to_s] = serialize(prop_value)
  end

  result
end