konduto/types/address/
address_name.rs

1use crate::impl_nutype_error_conversion;
2use nutype::nutype;
3
4/// Nome do destinatário (máximo 100 caracteres)
5///
6/// # Validações
7/// - Não pode ser vazio (após trim)
8/// - Máximo 100 caracteres
9///
10/// # Exemplos
11/// ```
12/// use konduto::AddressName;
13///
14/// let name = AddressName::try_new("John Doe").unwrap();
15/// assert_eq!(name.as_str(), "John Doe");
16/// ```
17#[nutype(
18    sanitize(trim),
19    validate(not_empty, len_char_max = 100),
20    derive(
21        Debug,
22        Clone,
23        PartialEq,
24        Eq,
25        Display,
26        AsRef,
27        Deref,
28        Serialize,
29        Deserialize,
30    )
31)]
32pub struct AddressName(String);
33
34impl AddressName {
35    /// Retorna o nome como string slice (compatibilidade)
36    pub fn as_str(&self) -> &str {
37        self.as_ref()
38    }
39}
40
41impl_nutype_error_conversion!(AddressNameError);
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46
47    #[test]
48    fn test_valid_name() {
49        let name = AddressName::try_new("John Doe").unwrap();
50        assert_eq!(name.as_str(), "John Doe");
51    }
52
53    #[test]
54    fn test_name_with_whitespace() {
55        let name = AddressName::try_new("  John Doe  ").unwrap();
56        assert_eq!(name.as_str(), "John Doe");
57    }
58
59    #[test]
60    fn test_empty_name() {
61        let result = AddressName::try_new("");
62        assert!(result.is_err());
63    }
64
65    #[test]
66    fn test_name_too_long() {
67        let long_name = "a".repeat(101);
68        let result = AddressName::try_new(long_name);
69        assert!(result.is_err());
70    }
71
72    #[test]
73    fn test_name_max_length() {
74        let name = "a".repeat(100);
75        let result = AddressName::try_new(name);
76        assert!(result.is_ok());
77    }
78
79    #[test]
80    fn test_serialization() {
81        let name = AddressName::try_new("Jane Doe").unwrap();
82        let json = serde_json::to_string(&name).unwrap();
83        assert_eq!(json, "\"Jane Doe\"");
84    }
85
86    #[test]
87    fn test_deserialization() {
88        let json = "\"John Smith\"";
89        let name: AddressName = serde_json::from_str(json).unwrap();
90        assert_eq!(name.as_str(), "John Smith");
91    }
92}