From f3a3fa6c1041d022ed5c4a0d141a09627f37820e Mon Sep 17 00:00:00 2001 From: Nathaniel Ledford Date: Fri, 9 Oct 2026 18:36:27 -0400 Subject: [PATCH] Engine: Session::sidecar_op, the half of Read Metadata that reads no file read_sidecar_op = read and parse the packet (file I/O) + sidecar_op (build the op from what it says). The split lets a worker thread do the reading while the UI thread only builds and commits the op. No change in behaviour. Co-Authored-By: Claude Opus 5.5 --- crates/engine/src/sidecar.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/crates/engine/src/sidecar.rs b/crates/engine/src/sidecar.rs index 7e9249489..f8127f685 100644 --- a/crates/engine/src/sidecar.rs +++ b/crates/engine/src/sidecar.rs @@ -475,9 +475,15 @@ impl Session { let p = self.catalog.photo(id).ok_or(lightcraft_catalog::CatalogError::NoPhoto(id))?; let Some(orig) = file_path(p) else { return Ok(None) }; let Some((packet, from)) = read_packet(orig, p.kind, self.sidecar_naming(id)) else { return Ok(None) }; - let sc = parse_sidecar(&packet, p.kind == MediaKind::Raw) - .map_err(|e| EngineError::Other(format!("{}: {e}", from.display())))? - .resolve_label(&self.catalog); + let sc = parse_sidecar(&packet, p.kind == MediaKind::Raw).map_err(|e| EngineError::Other(format!("{}: {e}", from.display())))?; + Ok(Some((self.sidecar_op(id, sc)?, from))) + } + + /// The op that applies what a sidecar says (already read and parsed, e.g. on a worker + /// thread) to photo `id`: the sidecar wins. No file is read. + pub fn sidecar_op(&self, id: PhotoId, sc: SidecarData) -> Result { + let p = self.catalog.photo(id).ok_or(lightcraft_catalog::CatalogError::NoPhoto(id))?; + let sc = sc.resolve_label(&self.catalog); let mut q = (**p).clone(); let develop_changed = merge_into(&mut q, &sc, &(self.clock)()); let mut ops = vec![ @@ -492,7 +498,7 @@ impl Session { if develop_changed { ops.extend(self.develop_op(id, (*q.develop).clone(), "Read Metadata from File")); } - Ok(Some((Op::Batch { ops }, from))) + Ok(Op::Batch { ops }) } /// Auto-write: sidecars for photos changed by `ops` (errors are logged, not returned).