rstgen/csharp/
modifier.rs

1//! Individual C# modifier
2
3use std::collections::BTreeSet;
4use {Custom, Element, IntoTokens, Tokens};
5
6/// A Csharp modifier.
7#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash)]
8pub enum Modifier {
9    /// public
10    Public,
11    /// private
12    Private,
13    /// internal
14    Internal,
15    /// protected
16    Protected,
17    /// abstract
18    Abstract,
19    /// async
20    Async,
21    /// const
22    Const,
23    /// event
24    Event,
25    /// extern
26    Extern,
27    /// new
28    New,
29    /// override
30    Override,
31    /// partial
32    Partial,
33    /// readonly
34    Readonly,
35    /// sealed
36    Sealed,
37    /// static
38    Static,
39    /// unsafe
40    Unsafe,
41    /// virtual
42    Virtual,
43    /// volatile
44    Volatile,
45}
46
47impl Modifier {
48    /// Get the name of the modifier.
49    pub fn name(&self) -> &'static str {
50        use self::Modifier::*;
51
52        match *self {
53            Public => "public",
54            Private => "private",
55            Internal => "internal",
56            Protected => "protected",
57            Abstract => "abstract",
58            Async => "async",
59            Const => "const",
60            Event => "event",
61            Extern => "extern",
62            New => "new",
63            Override => "override",
64            Partial => "partial",
65            Readonly => "readonly",
66            Sealed => "sealed",
67            Static => "static",
68            Unsafe => "unsafe",
69            Virtual => "virtual",
70            Volatile => "volatile",
71        }
72    }
73}
74
75impl<'el, C: Custom> From<Modifier> for Element<'el, C> {
76    fn from(value: Modifier) -> Self {
77        value.name().into()
78    }
79}
80
81impl<'el, C: Custom> IntoTokens<'el, C> for Vec<Modifier> {
82    fn into_tokens(self) -> Tokens<'el, C> {
83        self.into_iter()
84            .collect::<BTreeSet<_>>()
85            .into_iter()
86            .map(Element::from)
87            .collect()
88    }
89}
90
91#[cfg(test)]
92mod tests {
93    use super::Modifier;
94    use csharp::Csharp;
95    use tokens::Tokens;
96
97    #[test]
98    fn test_vec() {
99        use self::Modifier::*;
100        let el: Tokens<Csharp> = toks![Public, Static].join_spacing();
101        let s = el.to_string();
102        let out = s.as_ref().map(|s| s.as_str());
103        assert_eq!(Ok("public static"), out);
104    }
105}