Skip to main content

oparl_types/
name.rs

1// SPDX-FileCopyrightText: Politik im Blick developers
2// SPDX-FileCopyrightText: Wolfgang Silbermayr <wolfgang@silbermayr.at>
3//
4// SPDX-License-Identifier: AGPL-3.0-or-later OR EUPL-1.2
5
6#[derive(
7    Debug,
8    Clone,
9    PartialEq,
10    Eq,
11    PartialOrd,
12    Ord,
13    Hash,
14    derive_more::AsRef,
15    derive_more::Display,
16    derive_more::From,
17    derive_more::FromStr,
18    derive_more::Into,
19    serde::Serialize,
20    serde::Deserialize,
21)]
22#[cfg_attr(feature = "sea-orm", derive(sea_orm::DeriveValueType))]
23pub struct Name(String);
24
25impl From<&str> for Name {
26    fn from(value: &str) -> Self {
27        Self(value.into())
28    }
29}
30
31impl Name {
32    pub fn as_str(&self) -> &str {
33        self.0.as_str()
34    }
35}
36
37#[cfg(feature = "sea-orm")]
38mod sea_orm_impls {
39    use sea_orm::{ActiveValue, IntoActiveValue};
40
41    use super::Name;
42
43    impl IntoActiveValue<Name> for Name {
44        fn into_active_value(self) -> ActiveValue<Name> {
45            ActiveValue::Set(self)
46        }
47    }
48}
49
50#[cfg(test)]
51mod tests {
52    use pretty_assertions::assert_eq;
53
54    use super::Name;
55
56    #[test]
57    fn from_str() {
58        assert_eq!(
59            Name("Beispiel-System".to_string()),
60            "Beispiel-System"
61                .parse()
62                .expect("value must be a parseable name")
63        );
64    }
65}
66
67#[cfg(test)]
68mod serde_tests {
69    use pretty_assertions::assert_eq;
70    use serde_json::json;
71
72    use super::Name;
73
74    #[test]
75    fn serialize() {
76        assert_eq!(
77            json!(Name("Beispiel-System".to_string())),
78            json!("Beispiel-System")
79        );
80    }
81
82    #[test]
83    fn deserialize_good() {
84        let deserialized: Name = serde_json::from_value(json!("Beispiel-System"))
85            .expect("value must be deserializable as Name");
86        assert_eq!(deserialized, Name::from("Beispiel-System"));
87    }
88
89    #[test]
90    fn deserialize_bad() {
91        assert!(serde_json::from_value::<Name>(json!([])).is_err());
92        assert!(serde_json::from_value::<Name>(json!({})).is_err());
93        assert!(serde_json::from_value::<Name>(json!(true)).is_err());
94        assert!(serde_json::from_value::<Name>(json!(123)).is_err());
95    }
96}