mdcast_api/wire/
capabilities.rs1use serde::{Deserialize, Serialize};
6
7use crate::doc::Target;
8use crate::wire::generated::Generator;
9use crate::wire::render::TemplateFormat;
10
11#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
13pub struct CapabilitiesResponse {
14 pub targets: Vec<Target>,
19 pub template_formats: Vec<TemplateFormat>,
23 #[serde(default)]
27 pub generators: Vec<Generator>,
28 pub max_upload_bytes: u64,
32 pub version: String,
34}
35
36#[cfg(test)]
37mod tests {
38 use super::*;
39
40 #[test]
41 fn round_trips_through_json() {
42 let res = CapabilitiesResponse {
43 targets: vec![Target::Pdf, Target::PdfPresentation, Target::Docx],
44 template_formats: vec![TemplateFormat::Pdf, TemplateFormat::Html],
45 generators: vec![Generator::Qr, Generator::Fen, Generator::Pgn],
46 max_upload_bytes: 268_435_456,
47 version: "0.3.0".to_string(),
48 };
49
50 let json = serde_json::to_string(&res).unwrap();
51 assert_eq!(
52 serde_json::from_str::<CapabilitiesResponse>(&json).unwrap(),
53 res
54 );
55 }
56
57 #[test]
58 fn a_newer_servers_unknown_generator_does_not_fail_the_decode() {
59 let json = r#"{
60 "targets": ["pdf"], "template_formats": ["pdf"],
61 "generators": ["qr", "barcode"],
62 "max_upload_bytes": 1024, "version": "9.9.9"
63 }"#;
64 let res: CapabilitiesResponse = serde_json::from_str(json).unwrap();
65 assert_eq!(res.generators, [Generator::Qr, Generator::Unknown]);
66 assert_eq!(res.max_upload_bytes, 1024);
67 }
68
69 #[test]
70 fn targets_serialize_as_their_kebab_case_strings() {
71 let res = CapabilitiesResponse {
72 targets: vec![Target::HtmlReveal],
73 template_formats: vec![],
74 generators: vec![],
75 max_upload_bytes: 0,
76 version: String::new(),
77 };
78
79 let json = serde_json::to_value(&res).unwrap();
80 assert_eq!(json["targets"], serde_json::json!(["html-reveal"]));
81 }
82}