use crate::query::{CompiledQuery, QueryError};
use strop_core::Range;
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum Op {
Delete,
Yank,
Change,
Indent,
Dedent,
}
impl Op {
pub fn name(self) -> &'static str {
match self {
Op::Delete => "delete",
Op::Yank => "yank",
Op::Change => "change",
Op::Indent => "indent",
Op::Dedent => "dedent",
}
}
pub fn from_key(c: char) -> Option<Op> {
match c {
'd' => Some(Op::Delete),
'y' => Some(Op::Yank),
'c' => Some(Op::Change),
'>' => Some(Op::Indent),
'<' => Some(Op::Dedent),
_ => None,
}
}
pub fn key(self) -> &'static str {
match self {
Op::Delete => "d",
Op::Yank => "y",
Op::Change => "c",
Op::Indent => ">",
Op::Dedent => "<",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum Motion {
Left,
Down,
Up,
Right,
WordForward,
WordBackward,
WordEnd,
FirstNonBlank,
LineStart,
LineEnd,
Column,
FirstLine,
LastLine,
FindChar {
ch: char,
till: bool,
backward: bool,
},
Search(CompiledQuery),
SearchBackward(CompiledQuery),
BigWordForward,
BigWordBackward,
BigWordEnd,
WordEndBackward,
BigWordEndBackward,
ParagraphBackward,
ParagraphForward,
MatchPair,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum Object {
Word,
BigWord,
Quote(char),
Bracket {
open: char,
close: char,
},
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum Target {
Motion(Motion),
Object {
inner: bool,
obj: Object,
},
Linewise,
SurroundDelete(char),
SurroundChange {
from: char,
to: char,
},
SurroundAdd {
ch: char,
inner: Box<Target>,
},
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct Command {
pub op: Option<Op>,
pub register: Option<char>,
pub count: Option<usize>,
pub target: Target,
pub keys: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Parse {
Incomplete,
Invalid,
QueryError(QueryError),
Complete(Command),
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct Resolved {
pub range: Range,
pub motion_target: Option<usize>,
pub spec: String,
}