swift_bridge_ir/
bridge_macro_attributes.rs

1use proc_macro2::Ident;
2use syn::parse::{Parse, ParseStream};
3use syn::{Path, Token};
4
5/// The `...` in
6/// `#\[swift_bridge::bridge(...)\]`
7pub struct SwiftBridgeModuleAttrs {
8    #[allow(missing_docs)]
9    pub attributes: Vec<SwiftBridgeModuleAttr>,
10}
11
12/// An attribute within a `#\[swift_bridge::bridge(...)\]`
13pub enum SwiftBridgeModuleAttr {
14    /// Sets the path for the actual swift bridge crate that contains different helpers such
15    /// as `RustString`.
16    /// `#\[swift_bridge::bridge(swift_bridge_path = swift_bridge)\]`
17    SwiftBridgePath(Path),
18}
19
20impl Parse for SwiftBridgeModuleAttrs {
21    fn parse(input: ParseStream) -> syn::Result<Self> {
22        if input.is_empty() {
23            return Ok(SwiftBridgeModuleAttrs { attributes: vec![] });
24        }
25
26        let opts = syn::punctuated::Punctuated::<_, Token![,]>::parse_terminated(input)?;
27
28        Ok(SwiftBridgeModuleAttrs {
29            attributes: opts.into_iter().collect(),
30        })
31    }
32}
33
34impl Parse for SwiftBridgeModuleAttr {
35    fn parse(input: ParseStream) -> syn::Result<Self> {
36        let key: Ident = input.parse()?;
37        let _equals = input.parse::<Token![=]>()?;
38
39        let attr = match key.to_string().as_str() {
40            "swift_bridge_path" => SwiftBridgeModuleAttr::SwiftBridgePath(input.parse()?),
41            _ => {
42                return Err(syn::Error::new(input.span(), "Unknown attribute."));
43            }
44        };
45
46        Ok(attr)
47    }
48}