1pub 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}