Skip to content

Commit

Permalink
Add TypeNameInfo gated behind "info" and "serde" features.
Browse files Browse the repository at this point in the history
  • Loading branch information
azriel91 committed Feb 12, 2024
1 parent 63eafc8 commit f2e6d9d
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 0 deletions.
4 changes: 4 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,16 @@ license = "MIT OR Apache-2.0"

[dependencies]
nom = { version = "7.1.3", default-features = false, features = ["alloc"] }
serde = { version = "1.0.196", optional = true, features = ["derive"] }

[dev-dependencies]
pretty_assertions = "1.4.0"
serde_yaml = "0.9.31"

[features]
default = []
info = []
serde = ["dep:serde"]

[badges]
appveyor = { repository = "azriel91/tynm" }
Expand Down
6 changes: 6 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,16 @@ pub use crate::{
types::{TypeName, TypeNameDisplay},
};

#[cfg(feature = "info")]
pub use crate::type_name_info::TypeNameInfo;

mod parser;
mod type_params_fmt_opts;
mod types;

#[cfg(feature = "info")]
mod type_name_info;

/// Returns the simple type name.
///
/// # Type Parameters
Expand Down
86 changes: 86 additions & 0 deletions src/type_name_info.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
use alloc::string::String;

/// Holds both the short and full type names.
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct TypeNameInfo {
/// The short type name, e.g. `"Option<String>"`.
pub short_name: String,
/// The full type name, e.g. `"core::option::Option<alloc::string::String>"`.
pub full_name: String,
}

impl TypeNameInfo {
/// Returns `TypeNameInfo` for the given `T`.
pub fn new<T>() -> Self {
let short_name = crate::type_name::<T>();
let full_name = String::from(core::any::type_name::<T>());

Self {
short_name,
full_name,
}
}
}

#[cfg(test)]
mod tests {
use alloc::{format, string::String};

use super::TypeNameInfo;

#[test]
fn clone() {
let type_name_info = TypeNameInfo::new::<Option<String>>();

let clone = Clone::clone(&type_name_info);

assert_eq!(type_name_info, clone);
}

#[test]
fn debug() {
let type_name_info = TypeNameInfo::new::<Option<String>>();

assert_eq!(
"TypeNameInfo { \
short_name: \"Option<String>\", \
full_name: \"core::option::Option<alloc::string::String>\" \
}",
format!("{type_name_info:?}")
);
}

#[cfg(feature = "serde")]
#[test]
fn serialize() -> Result<(), serde_yaml::Error> {
let type_name_info = TypeNameInfo::new::<Option<String>>();

let serialized = serde_yaml::to_string(&type_name_info)?;

assert_eq!(
"\
short_name: Option<String>\n\
full_name: core::option::Option<alloc::string::String>\n\
",
serialized
);

Ok(())
}

#[cfg(feature = "serde")]
#[test]
fn deserialize() -> Result<(), serde_yaml::Error> {
let deserialized = serde_yaml::from_str(
"\
short_name: Option<String>\n\
full_name: core::option::Option<alloc::string::String>\n\
",
)?;

assert_eq!(TypeNameInfo::new::<Option<String>>(), deserialized);

Ok(())
}
}

0 comments on commit f2e6d9d

Please sign in to comment.