use crate::is_false;
use serde_json::Value as JsonValue;
use warpgate_api::{api_enum, api_struct};
api_enum!(
#[derive(Default)]
#[serde(tag = "type", rename_all = "kebab-case")]
pub enum PromptType {
#[default]
#[doc(hidden)]
None,
Confirm { default: bool },
Input { default: String },
Select {
default_index: usize,
options: Vec<JsonValue>,
},
}
);
api_struct!(
#[serde(default)]
pub struct SettingPrompt {
#[serde(skip_serializing_if = "Option::is_none")]
pub condition: Option<SettingCondition>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "is_false")]
pub minimal: bool,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub prompts: Vec<SettingPrompt>,
pub question: String,
#[serde(skip_serializing_if = "is_false")]
pub required: bool,
pub setting: String,
#[serde(skip_serializing_if = "is_false")]
pub skip_if_falsy: bool,
pub ty: PromptType,
}
);
impl SettingPrompt {
pub fn new(setting: impl AsRef<str>, question: impl AsRef<str>, ty: PromptType) -> Self {
Self {
minimal: true,
question: question.as_ref().into(),
required: true,
setting: setting.as_ref().into(),
ty,
..Default::default()
}
}
pub fn new_full(setting: impl AsRef<str>, question: impl AsRef<str>, ty: PromptType) -> Self {
let mut prompt = Self::new(setting, question, ty);
prompt.minimal = false;
prompt
}
}
api_enum!(
#[derive(Default)]
#[serde(tag = "op", content = "match", rename_all = "kebab-case")]
pub enum ConditionType {
BoolEquals(bool),
#[default]
Exists,
FloatEquals(f64),
IntEquals(i64),
NotExists,
StringContains(String),
StringEquals(String),
}
);
api_struct!(
pub struct SettingCondition {
pub op: ConditionType,
pub setting: String,
}
);