tinc_build/codegen/
mod.rs

1use std::collections::BTreeMap;
2
3pub(crate) use config::AttributeConfig;
4use service::{ProcessedService, handle_service};
5
6use self::serde::{handle_enum, handle_message};
7use crate::types::{ProtoPath, ProtoTypeRegistry};
8
9pub(crate) mod cel;
10mod config;
11pub(crate) mod prost_sanatize;
12mod serde;
13mod service;
14pub(crate) mod utils;
15
16#[derive(Default)]
17pub(crate) struct Package {
18    pub attributes: AttributeConfig,
19    pub extra_items: Vec<syn::Item>,
20    pub services: Vec<ProcessedService>,
21}
22
23impl Package {
24    pub(crate) fn push_item(&mut self, item: syn::Item) {
25        self.extra_items.push(item);
26    }
27}
28
29impl std::ops::Deref for Package {
30    type Target = AttributeConfig;
31
32    fn deref(&self) -> &Self::Target {
33        &self.attributes
34    }
35}
36
37impl std::ops::DerefMut for Package {
38    fn deref_mut(&mut self) -> &mut Self::Target {
39        &mut self.attributes
40    }
41}
42
43pub(crate) fn generate_modules(registry: &ProtoTypeRegistry) -> anyhow::Result<BTreeMap<ProtoPath, Package>> {
44    let mut modules = BTreeMap::new();
45
46    registry
47        .messages()
48        .filter(|message| !registry.has_extern(&message.full_name))
49        .try_for_each(|message| handle_message(message, modules.entry(message.package.clone()).or_default(), registry))?;
50
51    registry
52        .enums()
53        .filter(|enum_| !registry.has_extern(&enum_.full_name))
54        .try_for_each(|enum_| handle_enum(enum_, modules.entry(enum_.package.clone()).or_default(), registry))?;
55
56    registry
57        .services()
58        .try_for_each(|service| handle_service(service, modules.entry(service.package.clone()).or_default(), registry))?;
59
60    Ok(modules)
61}