use ot_tools_io_derive::{AsMutDerive, AsRefDerive};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use crate::projects::{
parse_hashmap_string_value, string_to_hashmap, ProjectParseError, SectionHeader,
};
#[derive(
Clone,
Debug,
Eq,
Hash,
Ord,
PartialEq,
PartialOrd,
Serialize,
Deserialize,
AsMutDerive,
AsRefDerive,
)]
pub struct OsMetadata {
pub filetype: String,
pub project_version: u32,
pub os_version: String,
}
impl Default for OsMetadata {
fn default() -> Self {
Self {
filetype: "OCTATRACK DPS-1 PROJECT".to_string(),
project_version: 19,
os_version: "R0177 1.40B".to_string(),
}
}
}
impl std::str::FromStr for OsMetadata {
type Err = ProjectParseError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
let hmap: HashMap<String, String> = string_to_hashmap(s, &SectionHeader::Meta)?;
Ok(Self {
filetype: parse_hashmap_string_value::<String>(&hmap, "type", None)
.map_err(|_| ProjectParseError::String)?,
project_version: parse_hashmap_string_value::<u32>(&hmap, "version", None)?,
os_version: parse_hashmap_string_value::<String>(&hmap, "os_version", None)
.map_err(|_| ProjectParseError::String)?,
})
}
}
impl std::fmt::Display for OsMetadata {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
let mut s = "".to_string();
s.push_str("[META]\r\n");
s.push_str(format!("TYPE={}", self.filetype).as_str());
s.push_str("\r\n");
s.push_str(format!("VERSION={}", self.project_version).as_str());
s.push_str("\r\n");
s.push_str(format!("OS_VERSION={}", self.os_version).as_str());
s.push_str("\r\n[/META]");
write!(f, "{s:#}")
}
}