use proc_macro2::Span;
use syn::parse::{Parse, ParseStream, Result};
use syn::spanned::Spanned;
use syn::token;
use super::PrivVis;
#[derive(Clone, Debug)]
pub struct Modifier {
pub vis: PrivVis,
pub imports: Option<token::Use>,
}
impl Parse for Modifier {
fn parse(input: ParseStream) -> Result<Self> {
Ok(Self {
vis: input.parse()?,
imports: if input.peek(token::Use) {
Some(input.parse()?)
} else {
None
},
})
}
}
impl Spanned for Modifier {
fn span(&self) -> Span {
self.vis.span()
}
}
#[cfg(test)]
mod tests {
use matches::assert_matches;
use quote::quote;
use crate::parse::*;
#[test]
fn test_parse_modifier() {
let modifier: Modifier = syn::parse2(quote!(priv)).unwrap();
assert_matches!(modifier.vis, PrivVis::Priv(_));
assert!(modifier.imports.is_none());
let modifier: Modifier = syn::parse2(quote!(priv use)).unwrap();
assert_matches!(modifier.vis, PrivVis::Priv(_));
assert!(modifier.imports.is_some());
let modifier: Modifier = syn::parse2(quote!()).unwrap();
assert_matches!(modifier.vis, PrivVis::Vis(syn::Visibility::Inherited));
assert!(modifier.imports.is_none());
let modifier: Modifier = syn::parse2(quote!(use)).unwrap();
assert_matches!(modifier.vis, PrivVis::Vis(syn::Visibility::Inherited));
assert!(modifier.imports.is_some());
let modifier: Modifier = syn::parse2(quote!(pub(self))).unwrap();
assert_matches!(modifier.vis, PrivVis::Vis(syn::Visibility::Restricted(_)));
assert!(modifier.imports.is_none());
let modifier: Modifier = syn::parse2(quote!(pub(self) use)).unwrap();
assert_matches!(modifier.vis, PrivVis::Vis(syn::Visibility::Restricted(_)));
assert!(modifier.imports.is_some());
}
}