use crate::syntax::path::path_compare_str;
use proc_macro2::TokenStream;
use quote::ToTokens;
use syn::parse::{Parse, ParseStream};
use syn::{Attribute, Item, ItemMod, Result, Token, Visibility};
#[derive(Clone, PartialEq, Eq)]
#[allow(clippy::large_enum_variant)]
pub enum CxxQtItem {
Item(Item),
Cxx(ItemMod),
CxxQt(ItemMod),
}
impl std::fmt::Debug for CxxQtItem {
fn fmt(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
CxxQtItem::Item(v0) => {
let mut formatter = formatter.debug_tuple("Item");
formatter.field(v0);
formatter.finish()
}
CxxQtItem::Cxx(v0) => {
let mut formatter = formatter.debug_tuple("Cxx");
formatter.field(v0);
formatter.finish()
}
CxxQtItem::CxxQt(v0) => {
let mut formatter = formatter.debug_tuple("CxxQt");
formatter.field(v0);
formatter.finish()
}
}
}
}
impl Parse for CxxQtItem {
fn parse(input: ParseStream) -> Result<Self> {
let ahead = input.fork();
let attributes = ahead.call(Attribute::parse_outer)?;
ahead.parse::<Visibility>()?;
ahead.parse::<Option<Token![unsafe]>>()?;
if ahead.peek(Token![mod]) {
for attribute in &attributes {
if path_compare_str(&attribute.path, &["cxx", "bridge"]) {
return input.parse().map(CxxQtItem::Cxx);
} else if path_compare_str(&attribute.path, &["cxx_qt", "bridge"]) {
return input.parse().map(CxxQtItem::CxxQt);
}
}
}
input.parse().map(CxxQtItem::Item)
}
}
impl ToTokens for CxxQtItem {
fn to_tokens(&self, tokens: &mut TokenStream) {
match self {
CxxQtItem::Item(item) => {
item.to_tokens(tokens);
}
CxxQtItem::Cxx(module) => {
module.to_tokens(tokens);
}
CxxQtItem::CxxQt(module) => {
module.to_tokens(tokens);
}
}
}
}