use std::path::Path;
use crate::engine::flow::DefinitionLoader;
use crate::engine::{Command, Flow, LoadError, Skill, Step, XorDef};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DefinitionKind {
Skill,
Flow,
}
impl DefinitionKind {
pub fn as_str(self) -> &'static str {
match self {
Self::Skill => "skill",
Self::Flow => "flow",
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum Target {
Command(Command),
Skill(Skill),
Flow(Flow),
Xor(XorDef),
}
impl Target {
pub fn into_flow(self) -> Flow {
let name = match &self {
Self::Flow(flow) => flow.name.clone(),
Self::Command(command) => command.display_name(),
Self::Skill(skill) => skill.name.clone(),
Self::Xor(_) => "xor".to_string(),
};
match self {
Self::Flow(flow) => flow,
target => Flow {
name,
items: vec![Step::new(target)],
},
}
}
}
pub fn resolve_definition(
repo: &Path,
name: &str,
kind: Option<DefinitionKind>,
) -> Result<Target, LoadError> {
DefinitionLoader::new(repo).resolve(name, kind)
}