use serde::{Deserialize, Serialize};
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Mode {
#[default]
Normal,
Visual,
Command,
Hint,
Insert,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PageMode {
#[default]
Normal,
Visual,
Command,
Hint,
Pending,
Insert,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PageAction {
ScrollUp(u32),
ScrollDown(u32),
ScrollLeft(u32),
ScrollRight(u32),
ScrollPageUp,
ScrollPageDown,
ScrollFullPageDown,
ScrollFullPageUp,
ScrollHalfPageDown,
ScrollHalfPageUp,
ScrollTop,
ScrollBottom,
TabNext,
TabPrev,
TabClose,
TabNew,
TabNewRight,
TabNewLeft,
PinTab,
ReopenClosedTab,
PasteUrl {
after: bool,
},
TabReorder {
from: u32,
to: u32,
},
MoveTabLeft,
MoveTabRight,
HistoryBack,
HistoryForward,
Reload,
ReloadHard,
StopLoading,
OpenOmnibar,
OpenCommandLine,
EnterHintMode,
EnterHintModeBackground,
EnterMode(PageMode),
Find {
forward: bool,
},
FindNext,
FindPrev,
YankUrl,
YankSelection,
ZoomIn,
ZoomOut,
ZoomReset,
OpenDevTools,
ClearCompletedDownloads,
EnterInsertMode,
FocusFirstInput,
ExitInsertMode,
}
impl PageAction {
pub fn is_repeatable(&self) -> bool {
use PageAction::*;
matches!(
self,
ScrollUp(_)
| ScrollDown(_)
| ScrollLeft(_)
| ScrollRight(_)
| ScrollPageUp
| ScrollPageDown
| ScrollFullPageDown
| ScrollFullPageUp
| ScrollHalfPageDown
| ScrollHalfPageUp
| TabNext
| TabPrev
| MoveTabLeft
| MoveTabRight
| HistoryBack
| HistoryForward
| FindNext
| FindPrev
| ZoomIn
| ZoomOut
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn page_mode_serde_round_trip() {
let s = toml::to_string(&Wrap {
m: PageMode::Visual,
})
.unwrap();
let back: Wrap = toml::from_str(&s).unwrap();
assert_eq!(back.m, PageMode::Visual);
}
#[test]
fn page_action_serde_round_trip_unit() {
let s = toml::to_string(&Wrap2 {
a: PageAction::Reload,
})
.unwrap();
let back: Wrap2 = toml::from_str(&s).unwrap();
assert_eq!(back.a, PageAction::Reload);
}
#[test]
fn page_action_serde_round_trip_count() {
let s = toml::to_string(&Wrap2 {
a: PageAction::ScrollDown(5),
})
.unwrap();
let back: Wrap2 = toml::from_str(&s).unwrap();
assert_eq!(back.a, PageAction::ScrollDown(5));
}
#[derive(Serialize, Deserialize)]
struct Wrap {
m: PageMode,
}
#[derive(Serialize, Deserialize)]
struct Wrap2 {
a: PageAction,
}
}