nvim_oxi_api/types/
mode.rs

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