use super::style::InlineTone;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum RewindAction {
RestoreBoth,
RestoreConversation,
RestoreCode,
SummarizeFromHere,
NeverMind,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum OpenAIServiceTierChoice {
ProjectDefault,
Flex,
Priority,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum InlineListSelection {
Model(usize),
DynamicModel(usize),
CustomProvider(usize),
RefreshDynamicModels,
Reasoning(String),
DisableReasoning,
OpenAIServiceTier(OpenAIServiceTierChoice),
CustomModel,
Theme(String),
Session(String),
SessionForkMode {
session_id: String,
summarize: bool,
},
ConfigAction(String),
SlashCommand(String),
ToolApproval(bool),
ToolApprovalDenyOnce,
ToolApprovalSession,
ToolApprovalPermanent,
ToolApprovalEnable,
FileConflictReload,
FileConflictViewDiff,
FileConflictAbort,
SessionLimitIncrease(usize),
RewindCheckpoint(usize),
RewindAction(RewindAction),
AskUserChoice {
tab_id: String,
choice_id: String,
text: Option<String>,
},
RequestUserInputAnswer {
question_id: String,
selected: Vec<String>,
other: Option<String>,
},
PlanApprovalExecute,
PlanApprovalFreshContext,
PlanApprovalEditPlan,
PlanApprovalDiscuss,
PlanApprovalAutoAccept,
PlanApprovalSwitchBuild,
PlanApprovalSwitchAuto,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum InlineItemKind {
#[default]
Item,
Header,
Setting,
Action,
Hint,
}
#[derive(Clone, Debug, Default)]
pub struct InlineListItem {
pub title: String,
pub subtitle: Option<String>,
pub badge: Option<String>,
pub indent: u8,
pub selection: Option<InlineListSelection>,
pub search_value: Option<String>,
pub value: Option<String>,
pub badge_tone: InlineTone,
pub kind: InlineItemKind,
}
impl InlineListItem {
#[must_use]
pub fn new(title: impl Into<String>, selection: Option<InlineListSelection>) -> Self {
Self { title: title.into(), selection, ..Self::default() }
}
#[must_use]
pub fn group_header(title: impl Into<String>) -> Self {
Self {
title: title.into(),
kind: InlineItemKind::Header,
..Self::default()
}
}
#[must_use]
pub fn group_divider() -> Self {
Self::default()
}
#[must_use]
pub fn with_subtitle(mut self, subtitle: impl Into<String>) -> Self {
self.subtitle = Some(subtitle.into());
self
}
#[must_use]
pub fn with_value(mut self, value: impl Into<String>) -> Self {
self.value = Some(value.into());
self
}
#[must_use]
pub fn with_badge(mut self, label: impl Into<String>, tone: InlineTone) -> Self {
self.badge = Some(label.into());
self.badge_tone = tone;
self
}
#[must_use]
pub fn with_kind(mut self, kind: InlineItemKind) -> Self {
self.kind = kind;
self
}
#[must_use]
pub fn with_indent(mut self, indent: u8) -> Self {
self.indent = indent;
self
}
#[must_use]
pub fn with_search_value(mut self, search_value: impl Into<String>) -> Self {
self.search_value = Some(search_value.into());
self
}
#[must_use]
pub fn is_header(&self) -> bool {
self.selection.is_none() && self.kind != InlineItemKind::Hint
}
}
#[derive(Clone, Debug)]
pub struct WizardStep {
pub title: String,
pub question: String,
pub items: Vec<InlineListItem>,
pub completed: bool,
pub answer: Option<InlineListSelection>,
pub allow_freeform: bool,
pub freeform_label: Option<String>,
pub freeform_placeholder: Option<String>,
pub freeform_default: Option<String>,
}