aopt/parser/
style.rs

1use std::ops::Deref;
2
3/// User set option style used for generate [`InvokeGuess`](crate::guess::InvokeGuess).
4#[derive(Debug, Clone, PartialEq, Eq, Hash)]
5#[non_exhaustive]
6pub enum UserStyle {
7    Main,
8
9    /// NOA argument base on position.
10    Pos,
11
12    /// The first NOA argument.
13    Cmd,
14
15    /// Option set style like `--opt=value`, the value is set after `=`.
16    EqualWithValue,
17
18    /// Option set style like `--opt value`, the value is set in next argument.
19    Argument,
20
21    /// Option set style like `--i42`, the value set in the option string, only support one letter.
22    EmbeddedValue,
23
24    /// Option set style like `--opt42`, the value set in the option string, but suppport more than one letter.
25    EmbeddedValuePlus,
26
27    /// Option set style like `-abc`, thus set both boolean options `a`, `b` and `c`.
28    CombinedOption,
29
30    /// Option set style like `--bool`, only support boolean option.
31    Boolean,
32
33    /// Option set style like `--flag`, but the value will be set to None.
34    Flag,
35}
36
37/// Manage the support option set style[`UserStyle`].
38#[derive(Debug, Clone)]
39pub struct OptStyleManager {
40    styles: Vec<UserStyle>,
41}
42
43impl Default for OptStyleManager {
44    fn default() -> Self {
45        Self {
46            styles: vec![
47                UserStyle::EqualWithValue,
48                UserStyle::Argument,
49                UserStyle::Boolean,
50                UserStyle::EmbeddedValue,
51            ],
52        }
53    }
54}
55
56impl OptStyleManager {
57    pub fn with(mut self, styles: Vec<UserStyle>) -> Self {
58        self.styles = styles;
59        self
60    }
61
62    pub fn set(&mut self, styles: Vec<UserStyle>) -> &mut Self {
63        self.styles = styles;
64        self
65    }
66
67    pub fn remove(&mut self, style: UserStyle) -> &mut Self {
68        if let Some((index, _)) = self.styles.iter().enumerate().find(|v| v.1 == &style) {
69            self.styles.remove(index);
70        }
71        self
72    }
73
74    pub fn insert(&mut self, index: usize, style: UserStyle) -> &mut Self {
75        self.styles.insert(index, style);
76        self
77    }
78
79    pub fn push(&mut self, style: UserStyle) -> &mut Self {
80        if !self.styles.iter().any(|v| v == &style) {
81            self.styles.push(style);
82        }
83        self
84    }
85}
86
87impl Deref for OptStyleManager {
88    type Target = Vec<UserStyle>;
89
90    fn deref(&self) -> &Self::Target {
91        &self.styles
92    }
93}