1use nvim_types as nvim;
2use serde::Deserialize;
3
4#[non_exhaustive]
5#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Deserialize)]
6pub enum Mode {
7 #[serde(rename = "c")]
8 CmdLine,
9
10 #[serde(rename = "i")]
11 Insert,
12
13 #[serde(rename = "!")]
14 InsertCmdLine,
15
16 #[serde(rename = "l")]
17 Langmap,
18
19 #[serde(rename(deserialize = " "))]
20 NormalVisualOperator,
21
22 #[serde(rename = "n")]
23 Normal,
24
25 #[serde(rename = "o")]
26 OperatorPending,
27
28 #[serde(rename = "s")]
29 Select,
30
31 #[serde(rename = "t")]
32 Terminal,
33
34 #[serde(rename = "x")]
35 Visual,
36
37 #[serde(rename = "v")]
38 VisualSelect,
39}
40
41macro_rules! is_mode {
42 ($fn_name:ident, $variant:ident) => {
43 #[inline(always)]
44 pub const fn $fn_name(&self) -> bool {
45 matches!(self, Mode::$variant)
46 }
47 };
48}
49
50impl Mode {
51 is_mode!(is_cmd_line, CmdLine);
52 is_mode!(is_insert, Insert);
53 is_mode!(is_langmap, Langmap);
54 is_mode!(is_nvo, NormalVisualOperator);
55 is_mode!(is_normal, Normal);
56 is_mode!(is_op_pending, OperatorPending);
57 is_mode!(is_select, Select);
58 is_mode!(is_terminal, Terminal);
59 is_mode!(is_visual, Visual);
60 is_mode!(is_visual_select, VisualSelect);
61}
62
63impl From<Mode> for nvim::String {
64 fn from(mode: Mode) -> Self {
65 use Mode::*;
66 match mode {
67 CmdLine => "c",
68 Insert => "i",
69 InsertCmdLine => "!",
70 Langmap => "l",
71 NormalVisualOperator => "",
72 Normal => "n",
73 OperatorPending => "o",
74 Select => "s",
75 Terminal => "t",
76 Visual => "x",
77 VisualSelect => "v",
78 }
79 .into()
80 }
81}