1use std::collections::BTreeSet;
3use {Custom, Element, IntoTokens, Tokens};
4
5#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Hash)]
7pub enum Modifier {
8 Open,
10 Public,
12 Internal,
14 FilePrivate,
16 Private,
18 Static,
20 Final,
22 Class,
24 Mutating,
26 Throws,
28 Convenience,
30 Override,
32 Required,
34}
35
36impl Modifier {
37 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}