Skip to main content

paperless_api/
dto.rs

1//! DTO traits and helpers.
2
3use serde::Serialize;
4
5use crate::id::PaperlessId;
6
7pub trait CreateDtoObject: Serialize {}
8
9pub trait Item {
10    type Id: PaperlessId;
11    type BaseType: serde::de::DeserializeOwned;
12    type CreateDto: CreateDtoObject;
13    type UpdateDto: UpdateDtoObject;
14
15    fn endpoint() -> &'static str;
16
17    fn id(&self) -> Self::Id;
18}
19
20/// Marker trait for update DTOs.
21pub trait UpdateDtoObject: Serialize {}
22
23// #[cfg(test)]
24// mod tests {
25//     use paperless_api_macros::{CreateDto as CreateDtoDerive, UpdateDto as UpdateDtoDerive};
26//     use serde::{Deserialize, Serialize};
27
28//     use super::{CreateDto, UpdateDto};
29
30//     #[derive(Debug, Default, Clone, Deserialize, Serialize, CreateDtoDerive, UpdateDtoDerive)]
31//     struct TestItem {
32//         #[dto(skip)]
33//         pub id: u32,
34//         pub name: String,
35//         #[serde(rename = "match")]
36//         pub match_pattern: String,
37//         pub optional: Option<bool>,
38//         #[dto(skip)]
39//         #[serde(default)]
40//         pub document_count: u32,
41//     }
42
43//     #[test]
44//     fn create_dto_has_correct_fields() {
45//         let dto = CreateTestItem {
46//             name: "hello".to_string(),
47//             match_pattern: "pattern".to_string(),
48//             optional: None,
49//         };
50//         let json = serde_json::to_string(&dto).unwrap();
51//         assert!(json.contains("\"name\""));
52//         assert!(json.contains("\"match\""));
53//         assert!(!json.contains("\"id\""));
54//         assert!(!json.contains("\"document_count\""));
55//     }
56
57//     #[test]
58//     fn update_dto_wraps_fields_in_option() {
59//         let dto = UpdateTestItem {
60//             name: Some("hello".to_string()),
61//             match_pattern: None,
62//             optional: Some(Some(true)),
63//         };
64//         let json = serde_json::to_string(&dto).unwrap();
65//         assert!(json.contains("\"name\":\"hello\""));
66//         assert!(!json.contains("\"match\""));
67//         assert!(json.contains("\"optional\":true"));
68//         assert!(!json.contains("\"id\""));
69//     }
70
71//     #[test]
72//     fn create_dto_implements_marker_trait() {
73//         fn assert_create<T: CreateDto>() {}
74//         assert_create::<CreateTestItem>();
75//     }
76
77//     #[test]
78//     fn update_dto_implements_marker_trait() {
79//         fn assert_update<T: UpdateDto>() {}
80//         assert_update::<UpdateTestItem>();
81//     }
82
83//     #[test]
84//     fn create_dto_default_works() {
85//         let dto = CreateTestItem::default();
86//         assert_eq!(dto.name, "");
87//         assert_eq!(dto.match_pattern, "");
88//         assert_eq!(dto.optional, None);
89//     }
90
91//     #[test]
92//     fn update_dto_default_is_all_none() {
93//         let dto = UpdateTestItem::default();
94//         assert_eq!(dto.name, None);
95//         assert_eq!(dto.match_pattern, None);
96//         assert_eq!(dto.optional, None);
97//     }
98// }