1use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
8pub enum TldrCacheUpdateSchema {
9 #[serde(rename = "mant.tldr-update/v1")]
11 V1,
12}
13
14impl TldrCacheUpdateSchema {
15 pub const ID: &'static str = "mant.tldr-update/v1";
17}
18
19#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
21#[serde(rename_all = "kebab-case")]
22pub enum TldrCacheAction {
23 Cloned,
25 Updated,
27}
28
29#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
31#[serde(rename_all = "camelCase")]
32#[schemars(extend("$id" = "urn:mant:tldr-update:v1"))]
33pub struct TldrCacheUpdate {
34 pub schema: TldrCacheUpdateSchema,
36 pub action: TldrCacheAction,
38 #[serde(skip_serializing_if = "Option::is_none")]
40 pub cache_dir: Option<String>,
41 #[serde(skip_serializing_if = "Option::is_none")]
43 pub client: Option<String>,
44 #[serde(skip_serializing_if = "Option::is_none")]
46 pub output: Option<String>,
47 #[serde(skip_serializing_if = "Option::is_none")]
49 pub revision: Option<String>,
50}
51
52#[cfg(test)]
53mod tests {
54 use serde_json::json;
55
56 use super::{TldrCacheAction, TldrCacheUpdate, TldrCacheUpdateSchema};
57
58 #[test]
59 fn cache_update_uses_a_stable_camel_case_shape() {
60 let update = TldrCacheUpdate {
61 schema: TldrCacheUpdateSchema::V1,
62 action: TldrCacheAction::Cloned,
63 cache_dir: Some("/cache/mant/tldr-pages".to_owned()),
64 client: None,
65 output: None,
66 revision: Some("abc123".to_owned()),
67 };
68
69 assert_eq!(
70 serde_json::to_value(update).expect("serialize update"),
71 json!({
72 "schema": "mant.tldr-update/v1",
73 "action": "cloned",
74 "cacheDir": "/cache/mant/tldr-pages",
75 "revision": "abc123"
76 })
77 );
78 }
79}