ot_tools_io/projects/
metadata.rs1use crate::RBoxErr;
10use serde::{Deserialize, Serialize};
11use std::collections::HashMap;
12
13use crate::projects::{
14 parse_hashmap_string_value, string_to_hashmap, ProjectFromString, ProjectRawFileSection,
15 ProjectToString,
16};
17
18#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
31pub struct ProjectMetadata {
32 pub filetype: String,
39
40 pub project_version: u32,
47
48 pub os_version: String,
55}
56
57impl Default for ProjectMetadata {
58 fn default() -> Self {
59 Self {
60 filetype: "OCTATRACK DPS-1 PROJECT".to_string(),
61 project_version: 19,
62 os_version: "R0177 1.40B".to_string(),
63 }
64 }
65}
66
67impl ProjectFromString for ProjectMetadata {
68 type T = Self;
69
70 fn from_string(data: &str) -> RBoxErr<Self> {
72 let hmap: HashMap<String, String> = string_to_hashmap(data, &ProjectRawFileSection::Meta)?;
73
74 Ok(Self {
75 filetype: parse_hashmap_string_value::<String>(&hmap, "type", None)?,
76 project_version: parse_hashmap_string_value::<u32>(&hmap, "version", None)?,
77 os_version: parse_hashmap_string_value::<String>(&hmap, "os_version", None)?,
78 })
79 }
80}
81
82impl ProjectToString for ProjectMetadata {
83 fn to_string(&self) -> RBoxErr<String> {
85 let mut s = "".to_string();
86 s.push_str("[META]\r\n");
87 s.push_str(format!("TYPE={}", self.filetype).as_str());
88 s.push_str("\r\n");
89 s.push_str(format!("VERSION={}", self.project_version).as_str());
90 s.push_str("\r\n");
91 s.push_str(format!("OS_VERSION={}", self.os_version).as_str());
92 s.push_str("\r\n[/META]");
93
94 Ok(s)
95 }
96}