plantuml_server_client_rs/
metadata.rs

1mod format_version;
2mod include;
3mod plantuml;
4
5pub use format_version::MetadataVersion;
6pub use include::{IncludesMetadata, IncludesMetadataItem};
7pub use plantuml::{PlantUmlMetadata, PlantUmlMetadataItem};
8
9use derive_getters::Getters;
10use format_version::{MetadataVersionV1, MetadataVersionV2};
11use serde::{Deserialize, Serialize};
12use std::path::PathBuf;
13use typed_builder::TypedBuilder;
14
15/// A metadata (v1) collected by `plantuml-server-client` during processing
16///
17/// * (deprecated: v1 format) `path` - the path of the input file
18/// * (deprecated: v1 format) `include` - the metadata about files collected for includes
19/// * (deprecated: v1 format) `plantuml` - the information in the generated plantuml diagrams
20/// * `files` - The information in the generated PlantUML diagrams
21#[derive(Deserialize, Serialize, TypedBuilder, Getters, Clone, Debug)]
22#[serde(rename_all = "camelCase")]
23pub struct Metadata {
24    #[builder(default)]
25    #[serde(default)]
26    format_version: MetadataVersionV1,
27
28    path: PathBuf,
29    includes: IncludesMetadata,
30    plantuml: PlantUmlMetadata,
31
32    #[serde(default)]
33    files: Vec<MetadataItem>,
34}
35
36/// A metadata collected by `plantuml-server-client` during processing
37///
38/// * `files` - The information in the generated PlantUML diagrams
39#[derive(Deserialize, Serialize, TypedBuilder, Getters, Clone, Debug)]
40#[serde(rename_all = "camelCase")]
41pub struct MetadataV2 {
42    #[builder(default)]
43    #[serde(default)]
44    format_version: MetadataVersionV2,
45
46    #[serde(default)]
47    files: Vec<MetadataItem>,
48}
49
50/// A metadata collected by `plantuml-server-client` during processing
51///
52/// * `path` - the path of the input file
53/// * `include` - the metadata about files collected for includes
54/// * `plantuml` - the information in the generated plantuml diagrams
55#[derive(Deserialize, Serialize, TypedBuilder, Getters, Clone, Debug)]
56pub struct MetadataItem {
57    path: PathBuf,
58    includes: IncludesMetadata,
59    plantuml: PlantUmlMetadata,
60}
61
62impl From<Vec<MetadataItem>> for MetadataV2 {
63    fn from(files: Vec<MetadataItem>) -> Self {
64        Self {
65            format_version: MetadataVersionV2::V2,
66            files,
67        }
68    }
69}
70
71impl From<MetadataV2> for Metadata {
72    fn from(metadata: MetadataV2) -> Self {
73        let MetadataItem {
74            path,
75            includes,
76            plantuml,
77        } = metadata.files.last().unwrap().clone(); // SAFETY: `unwrap()` is safe here since there is always at least one input file.
78
79        Self {
80            format_version: MetadataVersionV1::V1,
81            path,
82            includes,
83            plantuml,
84            files: metadata.files,
85        }
86    }
87}
88
89#[cfg(test)]
90mod tests {
91    use super::*;
92
93    #[tokio::test]
94    async fn test() -> anyhow::Result<()> {
95        let testdata = r#"
96            {
97                "formatVersion": "v1",
98                "path": "./root-path.puml",
99                "includes": [
100                    {
101                        "path": "./include_1.iuml",
102                        "normalized_path": "include_1.iuml",
103                        "base_path": "root-path.puml",
104                        "relative_path": "include_1.iuml",
105                        "id": "include_1"
106                    }
107                ],
108                "plantuml": [
109                    {
110                        "index": 0,
111                        "id": "figure_1",
112                        "output_path": "./output_1.svg",
113                        "titles": [],
114                        "headers": [],
115                        "footers": []
116                    },
117                    {
118                        "index": 1,
119                        "id": "figure_2",
120                        "output_path": "./output_2.svg",
121                        "titles": [],
122                        "headers": [],
123                        "footers": []
124                    }
125                ]
126            }"#;
127        serde_json::from_str::<Metadata>(&testdata)?;
128
129        Ok(())
130    }
131}