Skip to main content

eure_codegen_ir/
emission.rs

1use indexmap::IndexSet;
2
3#[derive(Debug, Clone, PartialEq, Eq, Default)]
4pub struct EmissionDefaultsIr {
5    pub serde_serialize: bool,
6    pub serde_deserialize: bool,
7    pub derive_allow: IndexSet<String>,
8}
9
10#[derive(Debug, Clone, PartialEq, Eq, Default)]
11pub struct TypeEmissionConfigIr {
12    pub serde_serialize: Option<bool>,
13    pub serde_deserialize: Option<bool>,
14    pub derive_allow: Option<IndexSet<String>>,
15}
16
17#[derive(Debug, Clone, PartialEq, Eq, Default)]
18pub struct EffectiveEmissionIr {
19    pub serde_serialize: bool,
20    pub serde_deserialize: bool,
21    pub derive_allow: IndexSet<String>,
22}
23
24pub fn effective_emission(
25    defaults: &EmissionDefaultsIr,
26    ty: &TypeEmissionConfigIr,
27) -> EffectiveEmissionIr {
28    EffectiveEmissionIr {
29        serde_serialize: ty.serde_serialize.unwrap_or(defaults.serde_serialize),
30        serde_deserialize: ty.serde_deserialize.unwrap_or(defaults.serde_deserialize),
31        derive_allow: ty
32            .derive_allow
33            .clone()
34            .unwrap_or_else(|| defaults.derive_allow.clone()),
35    }
36}
37
38pub fn filter_desired_derives(
39    desired: &[String],
40    defaults: &EmissionDefaultsIr,
41    ty: &TypeEmissionConfigIr,
42) -> Vec<String> {
43    let effective = effective_emission(defaults, ty);
44
45    desired
46        .iter()
47        .filter(|derive_name| effective.derive_allow.contains(*derive_name))
48        .filter(|derive_name| {
49            (derive_name.as_str() != "Serialize" || effective.serde_serialize)
50                && (derive_name.as_str() != "Deserialize" || effective.serde_deserialize)
51        })
52        .cloned()
53        .collect()
54}