diff --git a/src/snapshot_middleware/csv.rs b/src/snapshot_middleware/csv.rs index 17837667..3b38c3aa 100644 --- a/src/snapshot_middleware/csv.rs +++ b/src/snapshot_middleware/csv.rs @@ -5,11 +5,14 @@ use rbx_dom_weak::{RbxId, RbxTree, RbxValue}; use serde::Serialize; use crate::{ - imfs::{Imfs, ImfsEntry, ImfsFetcher}, + imfs::{FsResultExt, Imfs, ImfsEntry, ImfsFetcher}, snapshot::{InstanceMetadata, InstanceSnapshot}, }; -use super::middleware::{SnapshotFileResult, SnapshotInstanceResult, SnapshotMiddleware}; +use super::{ + meta_file::AdjacentMetadata, + middleware::{SnapshotFileResult, SnapshotInstanceResult, SnapshotMiddleware}, +}; pub struct SnapshotCsv; @@ -35,13 +38,17 @@ impl SnapshotMiddleware for SnapshotCsv { .to_string_lossy() .to_string(); + let meta_path = entry + .path() + .with_file_name(format!("{}.meta.json", instance_name)); + let table_contents = convert_localization_csv(entry.contents(imfs)?); - Ok(Some(InstanceSnapshot { + let mut snapshot = InstanceSnapshot { snapshot_id: None, metadata: InstanceMetadata { instigating_source: Some(entry.path().to_path_buf().into()), - relevant_paths: vec![entry.path().to_path_buf()], + relevant_paths: vec![entry.path().to_path_buf(), meta_path.clone()], ..Default::default() }, name: Cow::Owned(instance_name), @@ -52,7 +59,15 @@ impl SnapshotMiddleware for SnapshotCsv { }, }, children: Vec::new(), - })) + }; + + if let Some(meta_entry) = imfs.get(meta_path).with_not_found()? { + let meta_contents = meta_entry.contents(imfs)?; + let mut metadata = AdjacentMetadata::from_slice(meta_contents); + metadata.apply_all(&mut snapshot); + } + + Ok(Some(snapshot)) } fn from_instance(_tree: &RbxTree, _id: RbxId) -> SnapshotFileResult { @@ -159,4 +174,23 @@ Ack,Ack!,,An exclamation of despair,¡Ay!"#, assert_yaml_snapshot!(instance_snapshot); } + + #[test] + fn csv_with_meta() { + let mut imfs = Imfs::new(NoopFetcher); + let file = ImfsSnapshot::file( + r#" +Key,Source,Context,Example,es +Ack,Ack!,,An exclamation of despair,¡Ay!"#, + ); + let meta = ImfsSnapshot::file(r#"{ "ignoreUnknownInstances": true }"#); + + imfs.debug_load_snapshot("/foo.csv", file); + imfs.debug_load_snapshot("/foo.meta.json", meta); + + let entry = imfs.get("/foo.csv").unwrap(); + let instance_snapshot = SnapshotCsv::from_imfs(&mut imfs, &entry).unwrap().unwrap(); + + assert_yaml_snapshot!(instance_snapshot); + } } diff --git a/src/snapshot_middleware/snapshots/test__csv_from_imfs.snap b/src/snapshot_middleware/snapshots/test__csv_from_imfs.snap index 84a1cadc..705eb6e0 100644 --- a/src/snapshot_middleware/snapshots/test__csv_from_imfs.snap +++ b/src/snapshot_middleware/snapshots/test__csv_from_imfs.snap @@ -9,6 +9,7 @@ metadata: Path: /foo.csv relevant_paths: - /foo.csv + - /foo.meta.json name: foo class_name: LocalizationTable properties: diff --git a/src/snapshot_middleware/snapshots/test__csv_with_meta.snap b/src/snapshot_middleware/snapshots/test__csv_with_meta.snap new file mode 100644 index 00000000..5721dffd --- /dev/null +++ b/src/snapshot_middleware/snapshots/test__csv_with_meta.snap @@ -0,0 +1,19 @@ +--- +source: src/snapshot_middleware/csv.rs +expression: instance_snapshot +--- +snapshot_id: ~ +metadata: + ignore_unknown_instances: true + instigating_source: + Path: /foo.csv + relevant_paths: + - /foo.csv + - /foo.meta.json +name: foo +class_name: LocalizationTable +properties: + Contents: + Type: String + Value: "[{\"key\":\"Ack\",\"example\":\"An exclamation of despair\",\"source\":\"Ack!\",\"values\":{\"es\":\"¡Ay!\"}}]" +children: []