bo4e_core/com/
signature.rs1use serde::{Deserialize, Serialize};
4
5use crate::traits::{Bo4eMeta, Bo4eObject};
6
7#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
24#[serde(rename_all = "camelCase")]
25pub struct Signature {
26 #[serde(flatten)]
28 pub meta: Bo4eMeta,
29
30 #[serde(skip_serializing_if = "Option::is_none")]
32 pub name: Option<String>,
33
34 #[serde(skip_serializing_if = "Option::is_none")]
36 pub location: Option<String>,
37
38 #[serde(skip_serializing_if = "Option::is_none")]
40 pub date: Option<String>,
41}
42
43impl Bo4eObject for Signature {
44 fn type_name_german() -> &'static str {
45 "Unterschrift"
46 }
47
48 fn type_name_english() -> &'static str {
49 "Signature"
50 }
51
52 fn meta(&self) -> &Bo4eMeta {
53 &self.meta
54 }
55
56 fn meta_mut(&mut self) -> &mut Bo4eMeta {
57 &mut self.meta
58 }
59}
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64
65 #[test]
66 fn test_signature_default() {
67 let sig = Signature::default();
68 assert!(sig.name.is_none());
69 assert!(sig.location.is_none());
70 assert!(sig.date.is_none());
71 }
72
73 #[test]
74 fn test_signature_serialize() {
75 let sig = Signature {
76 name: Some("Hans Schmidt".to_string()),
77 location: Some("Berlin".to_string()),
78 date: Some("2024-06-15T14:00:00+02:00".to_string()),
79 ..Default::default()
80 };
81
82 let json = serde_json::to_string(&sig).unwrap();
83 assert!(json.contains(r#""name":"Hans Schmidt""#));
84 assert!(json.contains(r#""location":"Berlin""#));
85 assert!(json.contains(r#""date":"2024-06-15T14:00:00+02:00""#));
86 }
87
88 #[test]
89 fn test_signature_roundtrip() {
90 let sig = Signature {
91 meta: Bo4eMeta::with_type("Unterschrift"),
92 name: Some("Erika Musterfrau".to_string()),
93 location: Some("München".to_string()),
94 date: Some("2024-03-20T09:15:00+01:00".to_string()),
95 };
96
97 let json = serde_json::to_string(&sig).unwrap();
98 let parsed: Signature = serde_json::from_str(&json).unwrap();
99 assert_eq!(sig, parsed);
100 }
101
102 #[test]
103 fn test_bo4e_object_impl() {
104 assert_eq!(Signature::type_name_german(), "Unterschrift");
105 assert_eq!(Signature::type_name_english(), "Signature");
106 }
107}