eure_codegen_ir/
emission.rs1use 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}