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// }