1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
use proc_macro::TokenStream;
use syn::{AttributeArgs, ItemStruct};

use std::iter::FromIterator;

pub mod class_factory;
pub mod co_class_impl;
pub mod com_struct;
pub mod com_struct_impl;
pub mod iunknown_impl;

pub fn expand_co_class(input: &ItemStruct, attr_args: &AttributeArgs) -> TokenStream {
    let base_interface_idents = crate::utils::base_interface_idents(attr_args);
    let aggr_interface_idents = crate::utils::get_aggr_map(attr_args);

    let mut out: Vec<TokenStream> = Vec::new();
    out.push(com_struct::generate(&aggr_interface_idents, &base_interface_idents, input).into());
    out.push(
        com_struct_impl::generate(&aggr_interface_idents, &base_interface_idents, input).into(),
    );
    out.push(co_class_impl::generate(input).into());
    out.push(iunknown_impl::generate(&base_interface_idents, &aggr_interface_idents, input).into());
    out.push(class_factory::generate(input).into());

    TokenStream::from_iter(out)
}