derive_name/
lib.rs

1//! # Derive Name
2//!
3//! Derive macro to get the name of a struct, enum or enum variant.
4//!
5//! ## Name
6//!
7//! ```
8//! use derive_name::Name;
9//!
10//! #[derive(Name)]
11//! struct Alice;
12//!
13//! #[derive(Name)]
14//! enum Bob {}
15//!
16//! assert_eq!(Alice::name(), "Alice");
17//! assert_eq!(Bob::name(), "Bob");
18//! ```
19//!
20//! ## Named
21//!
22//! ```
23//! use derive_name::Named;
24//!
25//! #[derive(derive_name::Name)]
26//! struct Alice;
27//!
28//! #[derive(derive_name::Name)]
29//! enum Bob {
30//!     Variant
31//! }
32//!
33//! let her = Alice {};
34//! let his = Bob::Variant;
35//!
36//! assert_eq!(her.name(), "Alice");
37//! assert_eq!(his.name(), "Bob");
38//! ```
39//!
40//! ## VariantName
41//! ```
42//! use derive_name::VariantName;
43//!
44//! #[derive(VariantName)]
45//! enum Alice {
46//!     Bob
47//! }
48//!
49//! assert_eq!(Alice::Bob.variant_name(), "Bob");
50//! ```
51
52pub use derive_name_macros::{Name, VariantName};
53
54pub trait Name {
55    fn name() -> &'static str;
56}
57
58pub trait Named {
59    fn name(&self) -> &'static str;
60}
61
62impl<T: Name> Named for T {
63    fn name(&self) -> &'static str {
64        T::name()
65    }
66}
67
68pub trait VariantName {
69    fn variant_name(&self) -> &'static str;
70}
71
72#[cfg(test)]
73mod as_function {
74    use super::Name;
75    use crate as derive_name;
76
77    #[derive(Name)]
78    struct Struct;
79
80    #[derive(Name)]
81    enum Enum {}
82
83    #[test]
84    fn test() {
85        assert_eq!(Struct::name(), "Struct");
86        assert_eq!(Enum::name(), "Enum");
87    }
88}
89
90#[cfg(test)]
91mod as_method {
92    use super::Named;
93    use crate as derive_name;
94
95    #[derive(derive_name::Name)]
96    struct Struct;
97
98    #[derive(derive_name::Name)]
99    enum Enum {
100        A,
101    }
102
103    #[test]
104    fn test() {
105        assert_eq!(Struct.name(), "Struct");
106        assert_eq!(Enum::A.name(), "Enum");
107    }
108}
109
110#[cfg(test)]
111mod variant_name {
112    use super::VariantName;
113    use crate as derive_name;
114
115    #[derive(VariantName)]
116    enum Enum {
117        Alice,
118        Bob(i32),
119        Claire { i: i32 },
120    }
121
122    #[test]
123    fn test() {
124        assert_eq!(Enum::Alice.variant_name(), "Alice");
125        assert_eq!(Enum::Bob(1).variant_name(), "Bob");
126        assert_eq!(Enum::Claire { i: 1 }.variant_name(), "Claire");
127    }
128}