enum_display/
lib.rs

1#![doc = include_str!("../README.md")]
2#![cfg_attr(not(feature = "std"), no_std)]
3
4pub use enum_display_macro::*;
5
6#[cfg(test)]
7mod tests {
8    use super::*;
9
10    #[cfg(feature = "std")]
11    use std::string::{String, ToString};
12
13    #[cfg(not(feature = "std"))]
14    extern crate alloc;
15
16    #[cfg(not(feature = "std"))]
17    use alloc::string::{String, ToString};
18
19    #[allow(dead_code)]
20    #[derive(EnumDisplay)]
21    enum TestEnum {
22        Name,
23
24        #[display("Overridden Name")]
25        OverriddenName,
26
27        #[display("Unit: {variant}")]
28        NameFullFormat,
29
30        Address {
31            street: String,
32            city: String,
33            state: String,
34            zip: String,
35        },
36
37        #[display("Named: {variant} {{{street}, {zip}}}")]
38        AddressPartialFormat {
39            street: String,
40            city: String,
41            state: String,
42            zip: String,
43        },
44
45        #[display("Named: {variant} {{{street}, {city}, {state}, {zip}}}")]
46        AddressFullFormat {
47            street: String,
48            city: String,
49            state: String,
50            zip: String,
51        },
52
53        DateOfBirth(u32, u32, u32),
54
55        #[display("Unnamed: {variant}({2})")]
56        DateOfBirthPartialFormat(u32, u32, u32),
57
58        #[display("Unnamed: {variant}({0}, {1}, {2})")]
59        DateOfBirthFullFormat(u32, u32, u32),
60    }
61
62    #[allow(dead_code)]
63    #[derive(EnumDisplay)]
64    #[enum_display(case = "Kebab")]
65    enum TestEnumWithAttribute {
66        Name,
67        Address {
68            street: String,
69            city: String,
70            state: String,
71            zip: String,
72        },
73        DateOfBirth(u32, u32, u32),
74    }
75
76    #[allow(dead_code)]
77    #[derive(EnumDisplay)]
78    enum TestEnumWithLifetimeAndGenerics<'a, T: Clone>
79    where
80        T: core::fmt::Display,
81    {
82        Name,
83        Address {
84            street: &'a T,
85            city: &'a T,
86            state: &'a T,
87            zip: &'a T,
88        },
89        DateOfBirth(u32, u32, u32),
90    }
91
92    #[test]
93    fn test_unit_field_variant() {
94        assert_eq!(TestEnum::Name.to_string(), "Name");
95        assert_eq!(TestEnum::OverriddenName.to_string(), "Overridden Name");
96        assert_eq!(TestEnum::NameFullFormat.to_string(), "Unit: NameFullFormat");
97    }
98
99    #[test]
100    fn test_named_fields_variant() {
101        assert_eq!(
102            TestEnum::Address {
103                street: "123 Main St".to_string(),
104                city: "Any Town".to_string(),
105                state: "CA".to_string(),
106                zip: "12345".to_string()
107            }
108            .to_string(),
109            "Address"
110        );
111        assert_eq!(
112            TestEnum::AddressPartialFormat {
113                street: "123 Main St".to_string(),
114                city: "Any Town".to_string(),
115                state: "CA".to_string(),
116                zip: "12345".to_string()
117            }
118            .to_string(),
119            "Named: AddressPartialFormat {123 Main St, 12345}"
120        );
121        assert_eq!(
122            TestEnum::AddressFullFormat {
123                street: "123 Main St".to_string(),
124                city: "Any Town".to_string(),
125                state: "CA".to_string(),
126                zip: "12345".to_string()
127            }
128            .to_string(),
129            "Named: AddressFullFormat {123 Main St, Any Town, CA, 12345}"
130        );
131    }
132
133    #[test]
134    fn test_unnamed_fields_variant() {
135        assert_eq!(TestEnum::DateOfBirth(1, 2, 1999).to_string(), "DateOfBirth");
136        assert_eq!(
137            TestEnum::DateOfBirthPartialFormat(1, 2, 1999).to_string(),
138            "Unnamed: DateOfBirthPartialFormat(1999)"
139        );
140        assert_eq!(
141            TestEnum::DateOfBirthFullFormat(1, 2, 1999).to_string(),
142            "Unnamed: DateOfBirthFullFormat(1, 2, 1999)"
143        );
144    }
145
146    #[test]
147    fn test_unit_field_variant_case_transform() {
148        assert_eq!(TestEnumWithAttribute::Name.to_string(), "name");
149    }
150
151    #[test]
152    fn test_named_fields_variant_case_transform() {
153        assert_eq!(
154            TestEnumWithAttribute::Address {
155                street: "123 Main St".to_string(),
156                city: "Any Town".to_string(),
157                state: "CA".to_string(),
158                zip: "12345".to_string()
159            }
160            .to_string(),
161            "address"
162        );
163    }
164
165    #[test]
166    fn test_unnamed_fields_variant_case_transform() {
167        assert_eq!(
168            TestEnumWithAttribute::DateOfBirth(1, 1, 2000).to_string(),
169            "date-of-birth"
170        );
171    }
172
173    #[test]
174    fn test_unit_field_variant_with_lifetime_and_generics() {
175        assert_eq!(
176            TestEnumWithLifetimeAndGenerics::<'_, String>::Name.to_string(),
177            "Name"
178        );
179    }
180
181    #[test]
182    fn test_named_fields_variant_with_lifetime_and_generics() {
183        assert_eq!(
184            TestEnumWithLifetimeAndGenerics::Address {
185                street: &"123 Main St".to_string(),
186                city: &"Any Town".to_string(),
187                state: &"CA".to_string(),
188                zip: &"12345".to_string()
189            }
190            .to_string(),
191            "Address"
192        );
193    }
194
195    #[test]
196    fn test_unnamed_fields_variant_with_lifetime_and_generics() {
197        assert_eq!(
198            TestEnumWithLifetimeAndGenerics::<'_, String>::DateOfBirth(1, 1, 2000).to_string(),
199            "DateOfBirth"
200        );
201    }
202}