use std::collections::HashMap;
use crate::formats::archive::BinArchive;
use crate::formats::archive::BinArchiveReader;
use anyhow::{anyhow, Result};
pub struct TextData {
title: String,
entries: HashMap<String, String>
}
impl TextData {
pub fn new() -> Self {
TextData {
title: String::new(),
entries: HashMap::new()
}
}
pub fn read(archive: &BinArchive) -> Result<Self> {
let mut reader = BinArchiveReader::new(archive, 0);
let mut entries: HashMap<String, String> = HashMap::new();
let title = reader.read_shift_jis_string()?;
while reader.tell() < archive.size() {
match reader.read_label(0)? {
Some(label) => {
let value = reader.read_utf16_string()?;
entries.insert(label, value);
}
None => {
return Err(anyhow!("Malformed message archive {}", title));
}
}
}
Ok(TextData {
title,
entries
})
}
pub fn get_title(&self) -> &str {
&self.title
}
pub fn set_title(&mut self, new_title: String) {
self.title = new_title;
}
pub fn insert_or_overwrite(&mut self, key: String, value: String) {
self.entries.insert(key, value);
}
pub fn get_entry(&self, key: &String) -> Option<&String> {
self.entries.get(key)
}
pub fn delete_entry(&mut self, key: &String) {
self.entries.remove(key);
}
}