Class: Kernai::SkillContext
- Inherits:
-
Object
- Object
- Kernai::SkillContext
- Defined in:
- lib/kernai/skill_context.rb
Overview
Passed as the second argument to a skill’s execute block. Exposes ‘credential(:key)` and `config(:key)` lookups that go through the resolvers configured on Kernai.config.
Validation of required credentials happens lazily at access time, not at skill registration, so a skill can be defined in a context where its credentials aren’t yet set (tests, partial scenarios). Missing required credentials raise Kernai::CredentialMissingError only when the skill actually tries to read them.
Instance Method Summary collapse
- #config(key) ⇒ Object
- #credential(key) ⇒ Object
-
#initialize(skill, credential_resolver: nil, config_resolver: nil) ⇒ SkillContext
constructor
A new instance of SkillContext.
Constructor Details
#initialize(skill, credential_resolver: nil, config_resolver: nil) ⇒ SkillContext
Returns a new instance of SkillContext.
14 15 16 17 18 19 |
# File 'lib/kernai/skill_context.rb', line 14 def initialize(skill, credential_resolver: nil, config_resolver: nil) @skill = skill @credential_resolver = credential_resolver @config_resolver = config_resolver @cache = {} end |
Instance Method Details
#config(key) ⇒ Object
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/kernai/skill_context.rb', line 46 def config(key) key = key.to_sym spec = @skill.configs[key] unless spec raise ArgumentError, "Skill '#{@skill.name}' did not declare config '#{key}'. " \ "Declared: #{@skill.configs.keys.inspect}" end cache_key = [:config, key] return @cache[cache_key] if @cache.key?(cache_key) resolver = @config_resolver || Kernai.config.config_resolver raw = resolver.resolve(@skill.name, key) value = raw.nil? ? spec[:default] : coerce(raw, spec[:type]) @cache[cache_key] = value end |
#credential(key) ⇒ Object
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/kernai/skill_context.rb', line 21 def credential(key) key = key.to_sym spec = @skill.credentials[key] unless spec raise ArgumentError, "Skill '#{@skill.name}' did not declare credential '#{key}'. " \ "Declared: #{@skill.credentials.keys.inspect}" end cache_key = [:credential, key] return @cache[cache_key] if @cache.key?(cache_key) resolver = @credential_resolver || Kernai.config.credential_resolver value = resolver.resolve(@skill.name, key) if value.nil? && spec[:required] raise Kernai::CredentialMissingError, "Missing required credential '#{key}' for skill '#{@skill.name}'. " \ 'Configure it via the host (e.g. kernai-shell `/skill-config`) or ' \ "set KERNAI_SKILL_#{@skill.name.to_s.upcase}_#{key.to_s.upcase}." end @cache[cache_key] = value end |