diff options
Diffstat (limited to 'systems/sheet/src/sheet.rs')
| -rw-r--r-- | systems/sheet/src/sheet.rs | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/systems/sheet/src/sheet.rs b/systems/sheet/src/sheet.rs index 07d284b..e7a130d 100644 --- a/systems/sheet/src/sheet.rs +++ b/systems/sheet/src/sheet.rs @@ -13,7 +13,7 @@ use crate::{ index_source::IndexSource, mapping::{LocalMapping, LocalMappingForward, Mapping, MappingBuf}, sheet::{ - error::{ReadSheetDataError, SheetApplyError, SheetEditError}, + error::{ParseSheetError, ReadSheetDataError, SheetApplyError, SheetEditError}, reader::{read_mapping, read_sheet_data}, writer::convert_sheet_data_to_bytes, }, @@ -486,6 +486,42 @@ impl SheetData { } } +impl std::fmt::Display for SheetData { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut vec = self + .mappings() + .iter() + .cloned() + .collect::<Vec<LocalMapping>>(); + vec.sort(); + write!( + f, + "{}", + vec.iter() + .map(|m| m.to_string()) + .collect::<Vec<_>>() + .join("\n") + ) + } +} + +impl TryFrom<&str> for SheetData { + type Error = ParseSheetError; + + fn try_from(value: &str) -> Result<Self, Self::Error> { + let mut sheet = SheetData::empty().pack("temp"); + for line in value.split("\n") { + if line.trim().is_empty() { + continue; + } + let mapping = LocalMapping::try_from(line)?; + let _ = sheet.insert_mapping(mapping)?; + } + let _ = sheet.apply()?; + Ok(sheet.unpack()) + } +} + impl From<SheetData> for Vec<u8> { fn from(value: SheetData) -> Self { value.as_bytes() |
