Skip to content

Commit

Permalink
Move MultiName to a new module
Browse files Browse the repository at this point in the history
  • Loading branch information
dtolnay committed Nov 11, 2024
1 parent 3035d4f commit f0b5c4f
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 54 deletions.
59 changes: 5 additions & 54 deletions serde_derive/src/internals/attr.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use crate::internals::name::MultiName;
use crate::internals::symbol::*;
use crate::internals::{ungroup, Ctxt};
use proc_macro2::{Spacing, Span, TokenStream, TokenTree};
Expand All @@ -21,7 +22,7 @@ use syn::{parse_quote, token, Ident, Lifetime, Token};

pub use crate::internals::case::RenameRule;

struct Attr<'c, T> {
pub(crate) struct Attr<'c, T> {
cx: &'c Ctxt,
name: Symbol,
tokens: TokenStream,
Expand Down Expand Up @@ -62,7 +63,7 @@ impl<'c, T> Attr<'c, T> {
}
}

fn get(self) -> Option<T> {
pub(crate) fn get(self) -> Option<T> {
self.value
}

Expand Down Expand Up @@ -90,7 +91,7 @@ impl<'c> BoolAttr<'c> {
}
}

struct VecAttr<'c, T> {
pub(crate) struct VecAttr<'c, T> {
cx: &'c Ctxt,
name: Symbol,
first_dup_tokens: TokenStream,
Expand Down Expand Up @@ -125,65 +126,15 @@ impl<'c, T> VecAttr<'c, T> {
}
}

fn get(self) -> Vec<T> {
pub(crate) fn get(self) -> Vec<T> {
self.values
}
}

pub struct MultiName {
serialize: String,
serialize_renamed: bool,
deserialize: String,
deserialize_renamed: bool,
deserialize_aliases: BTreeSet<String>,
}

fn unraw(ident: &Ident) -> String {
ident.to_string().trim_start_matches("r#").to_owned()
}

impl MultiName {
fn from_attrs(
source_name: String,
ser_name: Attr<String>,
de_name: Attr<String>,
de_aliases: Option<VecAttr<String>>,
) -> Self {
let mut alias_set = BTreeSet::new();
if let Some(de_aliases) = de_aliases {
for alias_name in de_aliases.get() {
alias_set.insert(alias_name);
}
}

let ser_name = ser_name.get();
let ser_renamed = ser_name.is_some();
let de_name = de_name.get();
let de_renamed = de_name.is_some();
MultiName {
serialize: ser_name.unwrap_or_else(|| source_name.clone()),
serialize_renamed: ser_renamed,
deserialize: de_name.unwrap_or(source_name),
deserialize_renamed: de_renamed,
deserialize_aliases: alias_set,
}
}

/// Return the container name for the container when serializing.
pub fn serialize_name(&self) -> &str {
&self.serialize
}

/// Return the container name for the container when deserializing.
pub fn deserialize_name(&self) -> &str {
&self.deserialize
}

fn deserialize_aliases(&self) -> &BTreeSet<String> {
&self.deserialize_aliases
}
}

#[derive(Copy, Clone)]
pub struct RenameAllRules {
pub serialize: RenameRule,
Expand Down
1 change: 1 addition & 0 deletions serde_derive/src/internals/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ pub mod attr;
mod case;
mod check;
mod ctxt;
mod name;
mod receiver;
mod respan;
mod symbol;
Expand Down
52 changes: 52 additions & 0 deletions serde_derive/src/internals/name.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
use crate::internals::attr::{Attr, VecAttr};
use std::collections::BTreeSet;

pub struct MultiName {
pub(crate) serialize: String,
pub(crate) serialize_renamed: bool,
pub(crate) deserialize: String,
pub(crate) deserialize_renamed: bool,
pub(crate) deserialize_aliases: BTreeSet<String>,
}

impl MultiName {
pub(crate) fn from_attrs(
source_name: String,
ser_name: Attr<String>,
de_name: Attr<String>,
de_aliases: Option<VecAttr<String>>,
) -> Self {
let mut alias_set = BTreeSet::new();
if let Some(de_aliases) = de_aliases {
for alias_name in de_aliases.get() {
alias_set.insert(alias_name);
}
}

let ser_name = ser_name.get();
let ser_renamed = ser_name.is_some();
let de_name = de_name.get();
let de_renamed = de_name.is_some();
MultiName {
serialize: ser_name.unwrap_or_else(|| source_name.clone()),
serialize_renamed: ser_renamed,
deserialize: de_name.unwrap_or(source_name),
deserialize_renamed: de_renamed,
deserialize_aliases: alias_set,
}
}

/// Return the container name for the container when serializing.
pub fn serialize_name(&self) -> &str {
&self.serialize
}

/// Return the container name for the container when deserializing.
pub fn deserialize_name(&self) -> &str {
&self.deserialize
}

pub(crate) fn deserialize_aliases(&self) -> &BTreeSet<String> {
&self.deserialize_aliases
}
}

0 comments on commit f0b5c4f

Please sign in to comment.