Class: DhanHQ::Skills::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/DhanHQ/skills/base.rb

Overview

Base class for all trading skills.

Provides a DSL for defining parameters, steps, and execution logic. Skills are stateless — context is passed through and returned.

Examples:

class BuyAtmCall < DhanHQ::Skills::Base
  param :symbol, type: :string, required: true
  param :expiry, type: :string, required: true
  param :quantity, type: :integer, default: 50

  step :find_instrument
  step :get_spot_price
  step :prepare_intent

  def find_instrument(ctx)
    ctx[:instrument] = DhanHQ::Models::Instrument.find("IDX_I", ctx[:symbol])
    ctx
  end

  def get_spot_price(ctx)
    ctx[:spot_price] = ctx[:instrument].ltp[:ltp]
    ctx
  end

  def prepare_intent(ctx)
    ctx[:intent] = { symbol: ctx[:symbol], spot: ctx[:spot_price] }
    ctx
  end
end

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.param(name, type: :string, required: false, default: nil, description: nil) ⇒ Object

Define a parameter for this skill.

Parameters:

  • name (Symbol)

    parameter name

  • type (Symbol) (defaults to: :string)

    :string, :integer, :number, :boolean

  • required (Boolean) (defaults to: false)

    whether the parameter is required

  • default (Object) (defaults to: nil)

    default value if not provided



44
45
46
47
# File 'lib/DhanHQ/skills/base.rb', line 44

def param(name, type: :string, required: false, default: nil, description: nil)
  @params ||= {}
  @params[name] = { type: type, required: required, default: default, description: description }
end

.paramsObject

Accessor for defined parameters.



60
61
62
# File 'lib/DhanHQ/skills/base.rb', line 60

def params
  @params || {}
end

.step(name, priority: 10) ⇒ Object

Define a step in the skill execution sequence.

Parameters:

  • name (Symbol)

    method name to call

  • priority (Integer) (defaults to: 10)

    execution order (lower = earlier)



53
54
55
56
57
# File 'lib/DhanHQ/skills/base.rb', line 53

def step(name, priority: 10)
  @steps ||= []
  @steps << { name: name, priority: priority }
  @steps.sort_by! { |s| s[:priority] }
end

.stepsObject

Accessor for defined steps.



65
66
67
# File 'lib/DhanHQ/skills/base.rb', line 65

def steps
  @steps || []
end

.validate_params!(args) ⇒ Object

Validate that all required parameters are present.

Parameters:

  • args (Hash)

    provided parameters

Raises:

  • (ArgumentError)

    if required parameters are missing



73
74
75
76
77
78
79
80
81
82
# File 'lib/DhanHQ/skills/base.rb', line 73

def validate_params!(args)
  params.each do |name, config|
    next unless config[:required]

    value = args[name] || args[name.to_s]
    next unless value.nil?

    raise ArgumentError, "Missing required parameter: #{name}"
  end
end

Instance Method Details

#call(args = {}) ⇒ Hash

Execute the skill with the given arguments.

Parameters:

  • args (Hash) (defaults to: {})

    skill parameters (symbol or string keys)

Returns:

  • (Hash)

    context with all accumulated state

Raises:

  • (ArgumentError)

    if required parameters are missing



90
91
92
93
94
95
96
97
98
99
100
# File 'lib/DhanHQ/skills/base.rb', line 90

def call(args = {})
  ctx = build_context(args)
  self.class.validate_params!(ctx)

  self.class.steps.each do |step|
    result = send(step[:name], ctx)
    ctx = result if result.is_a?(Hash)
  end

  ctx
end

#descriptionObject

Skill description (override in subclasses).



108
109
110
# File 'lib/DhanHQ/skills/base.rb', line 108

def description
  self.class.to_s
end

#nameObject

Skill name (defaults to class name).



103
104
105
# File 'lib/DhanHQ/skills/base.rb', line 103

def name
  self.class.name || self.class.to_s
end

#param_definitionsObject

List of parameter definitions for this skill.



113
114
115
# File 'lib/DhanHQ/skills/base.rb', line 113

def param_definitions
  self.class.params
end