1use alloc::{collections::BTreeMap, string::String, vec::Vec};
4
5#[cfg(feature = "schemars")]
6use schemars::JsonSchema;
7#[cfg(feature = "serde")]
8use serde::{Deserialize, Serialize};
9use serde_json::Value;
10
11#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
13#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
14#[cfg_attr(feature = "schemars", derive(JsonSchema))]
15#[cfg_attr(feature = "serde", serde(transparent))]
16pub struct WizardId(pub String);
17
18impl WizardId {
19 pub fn as_str(&self) -> &str {
21 &self.0
22 }
23}
24
25impl From<String> for WizardId {
26 fn from(value: String) -> Self {
27 Self(value)
28 }
29}
30
31impl From<&str> for WizardId {
32 fn from(value: &str) -> Self {
33 Self(value.to_owned())
34 }
35}
36
37impl From<WizardId> for String {
38 fn from(value: WizardId) -> Self {
39 value.0
40 }
41}
42
43#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
45#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
46#[cfg_attr(feature = "schemars", derive(JsonSchema))]
47#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
48pub enum WizardTarget {
49 Component,
51 Flow,
53 Pack,
55 Operator,
57 Dev,
59 Bundle,
61}
62
63#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
65#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
66#[cfg_attr(feature = "schemars", derive(JsonSchema))]
67#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
68pub enum WizardMode {
69 Default,
71 Setup,
73 Update,
75 Remove,
77 Scaffold,
79 Build,
81 New,
83}
84
85#[derive(Clone, Debug, PartialEq)]
87#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
88#[cfg_attr(feature = "schemars", derive(JsonSchema))]
89pub struct WizardPlanMeta {
90 pub id: WizardId,
92 pub target: WizardTarget,
94 pub mode: WizardMode,
96}
97
98#[derive(Clone, Debug, PartialEq)]
100#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
101#[cfg_attr(feature = "schemars", derive(JsonSchema))]
102pub struct WizardPlan {
103 pub meta: WizardPlanMeta,
105 pub steps: Vec<WizardStep>,
107}
108
109#[derive(Clone, Debug, PartialEq)]
111#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
112#[cfg_attr(feature = "schemars", derive(JsonSchema))]
113#[cfg_attr(feature = "serde", serde(rename_all = "snake_case", tag = "type"))]
114pub enum WizardStep {
115 EnsureDir {
117 paths: Vec<String>,
119 },
120 WriteFiles {
122 files: BTreeMap<String, String>,
124 },
125 RunCli {
127 command: String,
129 #[cfg_attr(
131 feature = "serde",
132 serde(default, skip_serializing_if = "Vec::is_empty")
133 )]
134 args: Vec<String>,
135 },
136 Delegate {
138 target: WizardTarget,
140 id: WizardId,
142 mode: WizardMode,
144 #[cfg_attr(
146 feature = "serde",
147 serde(default, skip_serializing_if = "BTreeMap::is_empty")
148 )]
149 prefilled_answers: BTreeMap<String, Value>,
150 #[cfg_attr(
152 feature = "serde",
153 serde(default, skip_serializing_if = "BTreeMap::is_empty")
154 )]
155 output_map: BTreeMap<String, String>,
156 },
157}