Class: Desiru::Signature

Inherits:
Object
  • Object
show all
Defined in:
lib/desiru/signature.rb

Overview

Represents input/output specifications for modules Supports DSL-style signature strings like “question -> answer”

Defined Under Namespace

Classes: FieldHash, FieldWrapper

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(signature_string, descriptions: {}) ⇒ Signature

Returns a new instance of Signature.



79
80
81
82
83
84
85
86
87
88
# File 'lib/desiru/signature.rb', line 79

def initialize(signature_string, descriptions: {})
  @raw_signature = signature_string
  @descriptions = descriptions
  @input_fields = {}
  @output_fields = {}
  @input_fields_wrapper = FieldHash.new
  @output_fields_wrapper = FieldHash.new

  parse_signature!
end

Instance Attribute Details

#raw_signatureObject (readonly)

Returns the value of attribute raw_signature.



65
66
67
# File 'lib/desiru/signature.rb', line 65

def raw_signature
  @raw_signature
end

Instance Method Details

#coerce_inputs(inputs) ⇒ Object



120
121
122
123
124
125
126
127
128
129
# File 'lib/desiru/signature.rb', line 120

def coerce_inputs(inputs)
  result = {}

  @input_fields.each do |name, field|
    value = inputs[name] || inputs[name.to_s]
    result[name] = field.coerce(value)
  end

  result
end

#coerce_outputs(outputs) ⇒ Object



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

def coerce_outputs(outputs)
  result = {}

  @output_fields.each do |name, field|
    value = outputs[name] || outputs[name.to_s]
    result[name] = field.coerce(value)
  end

  result
end

#input_fieldsObject Also known as: inputs



67
68
69
# File 'lib/desiru/signature.rb', line 67

def input_fields
  @input_fields_wrapper
end

#output_fieldsObject Also known as: outputs



71
72
73
# File 'lib/desiru/signature.rb', line 71

def output_fields
  @output_fields_wrapper
end

#to_hObject



142
143
144
145
146
147
148
# File 'lib/desiru/signature.rb', line 142

def to_h
  {
    signature: raw_signature,
    inputs: @input_fields.transform_values(&:to_h),
    outputs: @output_fields.transform_values(&:to_h)
  }
end

#to_sObject



150
151
152
# File 'lib/desiru/signature.rb', line 150

def to_s
  raw_signature
end

#valid_inputs?(inputs) ⇒ Boolean

Returns:

  • (Boolean)

Raises:



90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/desiru/signature.rb', line 90

def valid_inputs?(inputs)
  missing = required_input_fields - inputs.keys.map(&:to_sym)
  raise SignatureError, "Missing required inputs: #{missing.join(', ')}" if missing.any?

  inputs.each do |name, value|
    field = @input_fields[name.to_sym]
    next unless field

    # Field.validate will raise ValidationError if validation fails
    field.valid?(value)
  end

  true
end

#valid_outputs?(outputs) ⇒ Boolean

Returns:

  • (Boolean)

Raises:



105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/desiru/signature.rb', line 105

def valid_outputs?(outputs)
  missing = required_output_fields - outputs.keys.map(&:to_sym)
  raise ValidationError, "Missing required outputs: #{missing.join(', ')}" if missing.any?

  outputs.each do |name, value|
    field = @output_fields[name.to_sym]
    next unless field

    # Field.validate will raise ValidationError if validation fails
    field.valid?(value)
  end

  true
end