use serde::{Deserialize, Serialize};
use crate::doc::Target;
use crate::wire::generated::Generator;
use crate::wire::render::TemplateFormat;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CapabilitiesResponse {
pub targets: Vec<Target>,
pub template_formats: Vec<TemplateFormat>,
#[serde(default)]
pub generators: Vec<Generator>,
pub max_upload_bytes: u64,
pub version: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn round_trips_through_json() {
let res = CapabilitiesResponse {
targets: vec![Target::Pdf, Target::PdfPresentation, Target::Docx],
template_formats: vec![TemplateFormat::Pdf, TemplateFormat::Html],
generators: vec![Generator::Qr, Generator::Fen, Generator::Pgn],
max_upload_bytes: 268_435_456,
version: "0.3.0".to_string(),
};
let json = serde_json::to_string(&res).unwrap();
assert_eq!(
serde_json::from_str::<CapabilitiesResponse>(&json).unwrap(),
res
);
}
#[test]
fn a_newer_servers_unknown_generator_does_not_fail_the_decode() {
let json = r#"{
"targets": ["pdf"], "template_formats": ["pdf"],
"generators": ["qr", "barcode"],
"max_upload_bytes": 1024, "version": "9.9.9"
}"#;
let res: CapabilitiesResponse = serde_json::from_str(json).unwrap();
assert_eq!(res.generators, [Generator::Qr, Generator::Unknown]);
assert_eq!(res.max_upload_bytes, 1024);
}
#[test]
fn targets_serialize_as_their_kebab_case_strings() {
let res = CapabilitiesResponse {
targets: vec![Target::HtmlReveal],
template_formats: vec![],
generators: vec![],
max_upload_bytes: 0,
version: String::new(),
};
let json = serde_json::to_value(&res).unwrap();
assert_eq!(json["targets"], serde_json::json!(["html-reveal"]));
}
}