Skip to main content

macros/
helpers.rs

1// SPDX-License-Identifier: GPL-2.0
2
3use proc_macro2::TokenStream;
4use quote::ToTokens;
5use syn::{
6    parse::{
7        Parse,
8        ParseStream, //
9    },
10    Attribute,
11    Error,
12    LitStr,
13    Result, //
14};
15
16/// A string literal that is required to have ASCII value only.
17pub(crate) struct AsciiLitStr(LitStr);
18
19impl Parse for AsciiLitStr {
20    fn parse(input: ParseStream<'_>) -> Result<Self> {
21        let s: LitStr = input.parse()?;
22        if !s.value().is_ascii() {
23            return Err(Error::new_spanned(s, "expected ASCII-only string literal"));
24        }
25        Ok(Self(s))
26    }
27}
28
29impl ToTokens for AsciiLitStr {
30    fn to_tokens(&self, ts: &mut TokenStream) {
31        self.0.to_tokens(ts);
32    }
33}
34
35impl AsciiLitStr {
36    pub(crate) fn value(&self) -> String {
37        self.0.value()
38    }
39}
40
41pub(crate) fn file() -> String {
42    #[cfg(not(CONFIG_RUSTC_HAS_SPAN_FILE))]
43    {
44        proc_macro::Span::call_site()
45            .source_file()
46            .path()
47            .to_string_lossy()
48            .into_owned()
49    }
50
51    #[cfg(CONFIG_RUSTC_HAS_SPAN_FILE)]
52    #[allow(clippy::incompatible_msrv)]
53    {
54        proc_macro::Span::call_site().file()
55    }
56}
57
58/// Obtain all `#[cfg]` attributes.
59pub(crate) fn gather_cfg_attrs(attr: &[Attribute]) -> impl Iterator<Item = &Attribute> + '_ {
60    attr.iter().filter(|a| a.path().is_ident("cfg"))
61}