use alloc::{collections::BTreeMap, string::String, vec::Vec};
#[cfg(feature = "schemars")]
use schemars::JsonSchema;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
#[cfg_attr(feature = "serde", serde(transparent))]
pub struct WizardId(pub String);
impl WizardId {
pub fn as_str(&self) -> &str {
&self.0
}
}
impl From<String> for WizardId {
fn from(value: String) -> Self {
Self(value)
}
}
impl From<&str> for WizardId {
fn from(value: &str) -> Self {
Self(value.to_owned())
}
}
impl From<WizardId> for String {
fn from(value: WizardId) -> Self {
value.0
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
pub enum WizardTarget {
Component,
Flow,
Pack,
Operator,
Dev,
Bundle,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
pub enum WizardMode {
Default,
Setup,
Update,
Remove,
Scaffold,
Build,
New,
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub struct WizardPlanMeta {
pub id: WizardId,
pub target: WizardTarget,
pub mode: WizardMode,
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
pub struct WizardPlan {
pub meta: WizardPlanMeta,
pub steps: Vec<WizardStep>,
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case", tag = "type"))]
pub enum WizardStep {
EnsureDir {
paths: Vec<String>,
},
WriteFiles {
files: BTreeMap<String, String>,
},
RunCli {
command: String,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Vec::is_empty")
)]
args: Vec<String>,
},
Delegate {
target: WizardTarget,
id: WizardId,
mode: WizardMode,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "BTreeMap::is_empty")
)]
prefilled_answers: BTreeMap<String, Value>,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "BTreeMap::is_empty")
)]
output_map: BTreeMap<String, String>,
},
}