use {
super::*,
crate::{
pattern::*,
verb::{Internal, VerbInvocation},
},
bet::BeTree,
};
#[derive(Debug, Clone)]
pub enum Command {
None,
VerbEdit(VerbInvocation),
VerbInvocate(VerbInvocation),
Internal {
internal: Internal,
input_invocation: Option<VerbInvocation>,
},
VerbTrigger {
index: usize,
input_invocation: Option<VerbInvocation>,
},
PatternEdit {
raw: String,
expr: BeTree<PatternOperator, PatternParts>,
},
Click(u16, u16),
DoubleClick(u16, u16),
}
impl Command {
pub fn empty() -> Command {
Command::None
}
pub fn from_parts(mut cp: CommandParts, finished: bool) -> Self {
if let Some(verb_invocation) = cp.verb_invocation.take() {
if finished {
Self::VerbInvocate(verb_invocation)
} else {
Self::VerbEdit(verb_invocation)
}
} else if finished {
Self::Internal {
internal: Internal::open_stay,
input_invocation: None,
}
} else {
Self::PatternEdit {
raw: cp.raw_pattern,
expr: cp.pattern,
}
}
}
pub fn is_verb_invocated_from_input(&self) -> bool {
matches!(self, Self::VerbInvocate(_))
}
pub fn from_raw(raw: String, finished: bool) -> Self {
let parts = CommandParts::from(raw);
Self::from_parts(parts, finished)
}
pub fn from_pattern(pattern: &InputPattern) -> Self {
Command::from_raw(pattern.raw.clone(), false)
}
}
impl Default for Command {
fn default() -> Command {
Command::empty()
}
}