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