use crate::parser::Parser;
use std::collections::HashSet;
use std::hash::Hash;
use syn::parse::Parse;
use syn::punctuated::Punctuated;
use syn::{token, Attribute, Generics, Ident, Type, Visibility};
pub type ComponentItem = ModuleItem<ComponentAttribute>;
mod kw {
syn::custom_keyword!(components);
syn::custom_keyword!(providers);
}
#[derive(Debug)]
pub struct ModuleData {
pub metadata: ModuleMetadata,
pub services: ModuleServices,
pub submodules: Punctuated<Submodule, syn::Token![,]>,
}
#[derive(Debug)]
pub struct ModuleMetadata {
pub visibility: Visibility,
pub identifier: Ident,
pub generics: Generics,
pub interface: Option<Type>,
}
#[derive(Debug)]
pub struct Submodule {
pub ty: Type,
pub services: ModuleServices,
}
#[derive(Debug)]
pub struct ModuleServices {
pub components: ModuleItems<kw::components, ComponentAttribute>,
pub comma_token: syn::Token![,],
pub providers: ModuleItems<kw::providers, ProviderAttribute>,
pub trailing_comma: Option<syn::Token![,]>,
}
#[derive(Debug)]
pub struct ModuleItems<T: Parse, A: Eq + Hash>
where
Attribute: Parser<A>,
{
pub keyword_token: T,
pub eq_token: token::Eq,
pub bracket_token: token::Bracket,
pub items: Punctuated<ModuleItem<A>, token::Comma>,
}
#[derive(Debug)]
pub struct ModuleItem<A: Eq + Hash>
where
Attribute: Parser<A>,
{
pub attributes: HashSet<A>,
pub ty: Type,
}
impl ModuleItem<ComponentAttribute> {
pub fn is_lazy(&self) -> bool {
self.attributes.contains(&ComponentAttribute::Lazy)
}
}
#[derive(Debug, Eq, PartialEq, Hash)]
pub enum ComponentAttribute {
Lazy,
}
#[derive(Debug, Eq, PartialEq, Hash)]
pub enum ProviderAttribute {
}