Skip to content

Commit 66599bc

Browse files
committed
Fix parsing of derive configs
1 parent a373bfe commit 66599bc

File tree

11 files changed

+539
-182
lines changed

11 files changed

+539
-182
lines changed

macros/src/config/for_enum.rs

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,6 @@
1+
mod config;
12
mod discriminant;
2-
mod encapsulate;
3-
mod standard;
4-
mod variant_discriminant;
53

6-
pub(crate) use self::encapsulate::EncapsulateDeriveEnumConfig;
7-
pub(crate) use self::variant_discriminant::VariantDiscriminantDeriveEnumConfig;
4+
pub(crate) use self::config::EnumConfig;
85

9-
use self::{discriminant::DiscriminantConfig, standard::EnumConfig};
10-
11-
pub(crate) type FromDeriveEnumConfig = EnumConfig;
12-
pub(crate) type TryIntoDeriveEnumConfig = EnumConfig;
13-
pub(crate) type FromVariantDeriveEnumConfig = EnumConfig;
14-
pub(crate) type IntoVariantDeriveEnumConfig = EnumConfig;
15-
pub(crate) type AsVariantDeriveEnumConfig = EnumConfig;
16-
pub(crate) type AsVariantMutDeriveEnumConfig = EnumConfig;
17-
pub(crate) type AsVariantRefDeriveEnumConfig = EnumConfig;
18-
pub(crate) type VariantDowncastDeriveEnumConfig = EnumConfig;
6+
use self::discriminant::DiscriminantConfig;

macros/src/config/for_enum/encapsulate.rs renamed to macros/src/config/for_enum/config.rs

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
1-
use crate::{attr::EXCLUDE, config::ExcludeConfig, parse_enumcapsulate_attrs};
1+
use crate::{
2+
attr::{DISCRIMINANT, EXCLUDE},
3+
config::ExcludeConfig,
4+
parse_enumcapsulate_attrs,
5+
};
6+
7+
use super::DiscriminantConfig;
28

39
#[derive(Clone, Default)]
4-
pub(crate) struct EncapsulateDeriveEnumConfig {
10+
pub(crate) struct EnumConfig {
511
exclude: Option<ExcludeConfig>,
12+
discriminant: Option<DiscriminantConfig>,
613
}
714

8-
impl EncapsulateDeriveEnumConfig {
15+
impl EnumConfig {
916
pub fn is_included(&self, name: &str) -> bool {
1017
!self.is_excluded(name)
1118
}
@@ -16,14 +23,24 @@ impl EncapsulateDeriveEnumConfig {
1623
.map(|excluded| excluded.is_excluded(name))
1724
.unwrap_or(false)
1825
}
26+
27+
pub(crate) fn discriminant(&self) -> Option<&DiscriminantConfig> {
28+
self.discriminant.as_ref()
29+
}
1930
}
2031

21-
impl EncapsulateDeriveEnumConfig {
32+
impl EnumConfig {
2233
pub(crate) fn from_enum(item_enum: &syn::ItemEnum) -> Result<Self, syn::Error> {
2334
let mut this = Self::default();
2435

2536
parse_enumcapsulate_attrs(&item_enum.attrs, |meta| {
26-
if meta.path.is_ident(EXCLUDE) {
37+
if meta.path.is_ident(DISCRIMINANT) {
38+
let mut discriminant = this.discriminant.take().unwrap_or_default();
39+
40+
discriminant.parse(&meta, item_enum)?;
41+
42+
this.discriminant = Some(discriminant);
43+
} else if meta.path.is_ident(EXCLUDE) {
2744
let mut exclude = this.exclude.take().unwrap_or_default();
2845

2946
exclude.parse(&meta, false)?;

macros/src/config/for_enum/standard.rs

Lines changed: 0 additions & 16 deletions
This file was deleted.

macros/src/config/for_enum/variant_discriminant.rs

Lines changed: 0 additions & 40 deletions
This file was deleted.

macros/src/config/for_variant.rs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,6 @@
1+
mod config;
12
mod discriminant;
2-
mod standard;
3-
mod variant_discriminant;
43

5-
pub(crate) use self::variant_discriminant::VariantDiscriminantDeriveVariantConfig;
4+
pub(crate) use self::config::VariantConfig;
65

7-
use self::{discriminant::DiscriminantConfig, standard::VariantConfig};
8-
9-
pub(crate) type FromDeriveVariantConfig = VariantConfig;
10-
pub(crate) type TryIntoDeriveVariantConfig = VariantConfig;
11-
pub(crate) type FromVariantDeriveVariantConfig = VariantConfig;
12-
pub(crate) type IntoVariantDeriveVariantConfig = VariantConfig;
13-
pub(crate) type AsVariantDeriveVariantConfig = VariantConfig;
14-
pub(crate) type AsVariantMutDeriveVariantConfig = VariantConfig;
15-
pub(crate) type AsVariantRefDeriveVariantConfig = VariantConfig;
6+
use self::discriminant::DiscriminantConfig;

macros/src/config/for_variant/standard.rs renamed to macros/src/config/for_variant/config.rs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
use syn::LitStr;
22

33
use crate::{
4-
attr::{EXCLUDE, FIELD},
4+
attr::{DISCRIMINANT, EXCLUDE, FIELD},
55
config::ExcludeConfig,
66
parse_enumcapsulate_attrs,
77
};
88

9+
use super::DiscriminantConfig;
10+
911
#[derive(Clone, Eq, PartialEq, Debug)]
1012
pub(crate) enum FieldSelector {
1113
Name(String),
@@ -14,6 +16,7 @@ pub(crate) enum FieldSelector {
1416

1517
#[derive(Clone, Default)]
1618
pub(crate) struct VariantConfig {
19+
discriminant: Option<DiscriminantConfig>,
1720
exclude: Option<ExcludeConfig>,
1821
field: Option<FieldSelector>,
1922
}
@@ -23,7 +26,13 @@ impl VariantConfig {
2326
let mut this = Self::default();
2427

2528
parse_enumcapsulate_attrs(&variant.attrs, |meta| {
26-
if meta.path.is_ident(EXCLUDE) {
29+
if meta.path.is_ident(DISCRIMINANT) {
30+
let mut discriminant = this.discriminant.take().unwrap_or_default();
31+
32+
discriminant.parse(&meta, variant)?;
33+
34+
this.discriminant = Some(discriminant);
35+
} else if meta.path.is_ident(EXCLUDE) {
2736
let mut exclude = this.exclude.take().unwrap_or_default();
2837

2938
exclude.parse(&meta, true)?;
@@ -51,14 +60,6 @@ impl VariantConfig {
5160
Ok(this)
5261
}
5362

54-
pub(crate) fn is_excluded(&self, name: &str) -> bool {
55-
if let Some(excludes) = &self.exclude {
56-
return excludes.is_excluded(name);
57-
}
58-
59-
false
60-
}
61-
6263
pub(crate) fn position_of_selected_field(
6364
&self,
6465
fields: &syn::Fields,
@@ -97,4 +98,12 @@ impl VariantConfig {
9798
)),
9899
}
99100
}
101+
102+
pub(crate) fn discriminant(&self) -> Option<&DiscriminantConfig> {
103+
self.discriminant.as_ref()
104+
}
105+
106+
pub(crate) fn exclude(&self) -> Option<&ExcludeConfig> {
107+
self.exclude.as_ref()
108+
}
100109
}

macros/src/config/for_variant/variant_discriminant.rs

Lines changed: 0 additions & 40 deletions
This file was deleted.

0 commit comments

Comments
 (0)