virtue_next/parse/
visibility.rs1use super::utils::assume_group;
2use super::utils::assume_ident;
3use super::utils::ident_eq;
4use crate::Result;
5use crate::prelude::Delimiter;
6use crate::prelude::TokenTree;
7use std::iter::Peekable;
8
9#[derive(Debug, PartialEq, Eq, Clone)]
11pub enum Visibility {
12 Default,
14
15 Pub,
17}
18
19impl Visibility {
20 #[allow(clippy::unnecessary_wraps)]
26 pub(crate) fn try_take(input: &mut Peekable<impl Iterator<Item = TokenTree>>) -> Result<Self> {
27 match input.peek() {
28 | Some(TokenTree::Ident(ident)) if ident_eq(ident, "pub") => {
29 assume_ident(input.next());
31
32 if let Some(TokenTree::Group(g)) = input.peek()
34 && g.delimiter() == Delimiter::Parenthesis
35 {
36 if let Some(TokenTree::Ident(i)) = g.stream().into_iter().next()
42 && matches!(i.to_string().as_str(), "crate" | "self" | "super" | "in")
43 {
44 assume_group(input.next());
46 }
47 }
48
49 Ok(Self::Pub)
50 },
51 | Some(TokenTree::Group(group)) => {
52 let mut iter = group.stream().into_iter();
55 let tokens = (iter.next(), iter.next());
56 match tokens {
57 | (Some(TokenTree::Ident(ident)), None) if ident_eq(&ident, "pub") => {
58 assume_group(input.next());
60
61 if let Some(TokenTree::Group(_)) = input.peek() {
63 assume_group(input.next());
65 }
66 Ok(Self::Pub)
67 },
68 | _ => Ok(Self::Default),
69 }
70 },
71 | _ => Ok(Self::Default),
72 }
73 }
74}
75
76#[test]
77fn test_visibility_try_take() {
78 use crate::token_stream;
79
80 assert_eq!(
81 Visibility::Default,
82 Visibility::try_take(&mut token_stream("")).unwrap()
83 );
84 assert_eq!(
85 Visibility::Pub,
86 Visibility::try_take(&mut token_stream("pub")).unwrap()
87 );
88 assert_eq!(
89 Visibility::Pub,
90 Visibility::try_take(&mut token_stream(" pub ")).unwrap(),
91 );
92 assert_eq!(
93 Visibility::Pub,
94 Visibility::try_take(&mut token_stream("\tpub\t")).unwrap()
95 );
96 assert_eq!(
97 Visibility::Pub,
98 Visibility::try_take(&mut token_stream("pub(crate)")).unwrap()
99 );
100 assert_eq!(
101 Visibility::Pub,
102 Visibility::try_take(&mut token_stream(" pub ( crate ) ")).unwrap()
103 );
104 assert_eq!(
105 Visibility::Pub,
106 Visibility::try_take(&mut token_stream("\tpub\t(\tcrate\t)\t")).unwrap()
107 );
108
109 assert_eq!(
110 Visibility::Default,
111 Visibility::try_take(&mut token_stream("pb")).unwrap()
112 );
113}