oparl_types/
keyword.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 Keyword(String);
24
25impl From<&str> for Keyword {
26    fn from(value: &str) -> Self {
27        Self(value.into())
28    }
29}
30
31impl Keyword {
32    pub fn as_str(&self) -> &str {
33        self.0.as_str()
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::Keyword;
40
41    use pretty_assertions::assert_eq;
42
43    #[test]
44    fn from_str() {
45        assert_eq!(
46            Keyword("finanzen".to_string()),
47            "finanzen"
48                .parse()
49                .expect("value must be a parseable Keyword")
50        );
51    }
52}
53
54#[cfg(test)]
55mod serde_tests {
56    use super::Keyword;
57    use pretty_assertions::assert_eq;
58    use serde_json::json;
59
60    #[test]
61    fn serialize() {
62        assert_eq!(json!(Keyword("finanzen".to_string())), json!("finanzen"));
63    }
64
65    #[test]
66    fn deserialize_good() {
67        let deserialized: Keyword = serde_json::from_value(json!("finanzen"))
68            .expect("value must be deserializable as Keyword");
69        assert_eq!(deserialized, Keyword::from("finanzen"));
70    }
71
72    #[test]
73    fn deserialize_bad() {
74        assert!(serde_json::from_value::<Keyword>(json!([])).is_err());
75        assert!(serde_json::from_value::<Keyword>(json!({})).is_err());
76        assert!(serde_json::from_value::<Keyword>(json!(true)).is_err());
77        assert!(serde_json::from_value::<Keyword>(json!(123)).is_err());
78    }
79}