summaryrefslogtreecommitdiff
path: root/systems/sheet/src/sheet.rs
diff options
context:
space:
mode:
Diffstat (limited to 'systems/sheet/src/sheet.rs')
-rw-r--r--systems/sheet/src/sheet.rs38
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()