use crate::*;
impl Resolver {
pub fn intent(&self, intent_id: &str) -> Option<IntentInfo> {
if !self.training.contains_key(intent_id) {
return None;
}
Some(IntentInfo {
id: intent_id.to_string(),
intent_type: self
.intent_types
.get(intent_id)
.copied()
.unwrap_or(IntentType::Action),
description: self
.descriptions
.get(intent_id)
.cloned()
.unwrap_or_default(),
instructions: self
.instructions
.get(intent_id)
.cloned()
.unwrap_or_default(),
persona: self.persona.get(intent_id).cloned().unwrap_or_default(),
source: self.sources.get(intent_id).cloned(),
target: self.targets.get(intent_id).cloned(),
schema: self.schemas.get(intent_id).cloned(),
guardrails: self.guardrails.get(intent_id).cloned().unwrap_or_default(),
training: self.training.get(intent_id).cloned().unwrap_or_default(),
})
}
pub fn update_intent(&mut self, intent_id: &str, edit: IntentEdit) -> Result<(), Error> {
if !self.training.contains_key(intent_id) {
return Err(Error::IntentNotFound(intent_id.to_string()));
}
let edit_json = serde_json::to_string(&edit).unwrap_or_default();
if let Some(t) = edit.intent_type {
self.intent_types.insert(intent_id.to_string(), t);
}
if let Some(d) = edit.description {
self.descriptions.insert(intent_id.to_string(), d);
}
if let Some(i) = edit.instructions {
if i.is_empty() {
self.instructions.remove(intent_id);
} else {
self.instructions.insert(intent_id.to_string(), i);
}
}
if let Some(p) = edit.persona {
if p.is_empty() {
self.persona.remove(intent_id);
} else {
self.persona.insert(intent_id.to_string(), p);
}
}
if let Some(s) = edit.source {
self.sources.insert(intent_id.to_string(), s);
}
if let Some(t) = edit.target {
self.targets.insert(intent_id.to_string(), t);
}
if let Some(s) = edit.schema {
self.schemas.insert(intent_id.to_string(), s);
}
if let Some(g) = edit.guardrails {
self.guardrails.insert(intent_id.to_string(), g);
}
self.bump_with_ops(vec![crate::oplog::Op::IntentMetadataUpdated {
id: intent_id.to_string(),
edit_json,
}]);
Ok(())
}
}