rstgen/swift/
modifier.rs

1/// A Swift modifier.
2use std::collections::BTreeSet;
3use {Custom, Element, IntoTokens, Tokens};
4
5/// Model for Enum.
6#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash)]
7pub enum Modifier {
8    /// open modifier
9    Open,
10    /// public modifier
11    Public,
12    /// internal modifier
13    Internal,
14    /// fileprivate modifier
15    FilePrivate,
16    /// private modifier
17    Private,
18    /// static modifier
19    Static,
20    /// final modifier
21    Final,
22    /// class modifier
23    Class,
24    /// mutating modifier
25    Mutating,
26    /// throws modifier
27    Throws,
28    /// convenience modifier
29    Convenience,
30    /// override modifier
31    Override,
32    /// required modifier
33    Required,
34}
35
36impl Modifier {
37    /// The literal name of the modifier.
38    pub fn name(&self) -> &'static str {
39        use self::Modifier::*;
40        match *self {
41            Open => "open",
42            Public => "public",
43            Internal => "internal",
44            FilePrivate => "fileprivate",
45            Private => "private",
46            Static => "static",
47            Final => "final",
48            Class => "class",
49            Mutating => "mutating",
50            Throws => "throws",
51            Convenience => "convenience",
52            Override => "override",
53            Required => "required",
54        }
55    }
56}
57
58impl<'el, C: Custom> From<Modifier> for Element<'el, C> {
59    fn from(value: Modifier) -> Self {
60        value.name().into()
61    }
62}
63
64impl<'el, C: Custom> IntoTokens<'el, C> for Vec<Modifier> {
65    fn into_tokens(self) -> Tokens<'el, C> {
66        self.into_iter()
67            .collect::<BTreeSet<_>>()
68            .into_iter()
69            .map(Element::from)
70            .collect()
71    }
72}
73
74#[cfg(test)]
75mod tests {
76    use super::Modifier;
77    use swift::Swift;
78    use tokens::Tokens;
79
80    #[test]
81    fn test_vec() {
82        use self::Modifier::*;
83        let el: Tokens<Swift> = toks![Public, Static, Final].join_spacing();
84        let s = el.to_string();
85        let out = s.as_ref().map(|s| s.as_str());
86        assert_eq!(Ok("public static final"), out);
87    }
88}