plantuml_server_client_rs/
metadata.rs1mod 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#[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#[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#[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(); 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}