use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
pub enum Motion {
Left,
Right,
Up,
Down,
WordStartNext,
WordEndNext,
WordStartPrev,
LineStart,
LineFirstNonBlank,
LineEnd,
DocStart,
DocEnd,
PageUp,
PageDown,
HalfPageUp,
HalfPageDown,
GotoLine(u32),
ForwardSexp,
BackwardSexp,
UpList,
DownList,
BeginningOfDefun,
EndOfDefun,
BeginningOfSexp,
EndOfSexp,
}
impl Motion {
#[must_use]
pub const fn is_structural(self) -> bool {
matches!(
self,
Self::ForwardSexp
| Self::BackwardSexp
| Self::UpList
| Self::DownList
| Self::BeginningOfDefun
| Self::EndOfDefun
| Self::BeginningOfSexp
| Self::EndOfSexp,
)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
pub enum Operator {
Delete,
Yank,
Change,
Indent,
Dedent,
Filter,
Format,
SlurpForward,
SlurpBackward,
BarfForward,
BarfBackward,
Splice,
Wrap,
Raise,
}
impl Operator {
#[must_use]
pub const fn leaves_register(self) -> bool {
matches!(self, Self::Delete | Self::Yank | Self::Change)
}
#[must_use]
pub const fn is_structural(self) -> bool {
matches!(
self,
Self::SlurpForward
| Self::SlurpBackward
| Self::BarfForward
| Self::BarfBackward
| Self::Splice
| Self::Wrap
| Self::Raise,
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn register_emitting_ops() {
assert!(Operator::Delete.leaves_register());
assert!(Operator::Yank.leaves_register());
assert!(Operator::Change.leaves_register());
assert!(!Operator::Format.leaves_register());
}
}