From 5807464fc7c0b1abae0a3f650baf3650809649c3 Mon Sep 17 00:00:00 2001 From: Edward Langley Date: Wed, 15 Apr 2026 23:08:00 -0700 Subject: [PATCH] refactor(io): move persistence and import into improvise-io (improvise-8zh) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Relocate the two I/O module trees into the improvise-io sub-crate scaffolded in the previous commit: git mv src/persistence -> crates/improvise-io/src/persistence git mv src/import -> crates/improvise-io/src/import The grammar file `improv.pest` moves alongside `persistence/mod.rs`; the `#[grammar = "persistence/improv.pest"]` attribute resolves relative to the new crate root and keeps working unchanged. No path edits inside the moved code: the `crate::model::*`, `crate::view::*`, `crate::workbook::*`, `crate::format::*`, and `crate::formula::*` imports inside persistence and import all continue to resolve because improvise-io's lib.rs re-exports those modules from improvise-core and improvise-formula, mirroring the pattern improvise-core uses for `formula`. Verified no `crate::ui::*`, `crate::command::*`, `crate::draw::*` imports exist in the moved code (per improvise-8zh acceptance criterion #3). Main-crate `src/lib.rs` now re-exports `import` and `persistence` from improvise-io, keeping every `crate::persistence::*` and `crate::import::*` path in the 4 consumer files (ui/app.rs, ui/effect.rs, ui/import_wizard_ui.rs, main.rs) resolving unchanged — no downstream edits needed. `examples/gen-grammar.rs` had `include_str!("../src/persistence/improv.pest")`; updated the relative path to the new location under `crates/improvise-io/src/persistence/`. Verification: - cargo check --workspace --examples: clean - cargo test --workspace: 616 passing (219 main + 190 core + 65 formula + 142 io) - cargo clippy --workspace --tests: clean - cargo build -p improvise-io: standalone build succeeds, confirming no UI/command leakage into the IO crate (improvise-8zh acceptance #2, #3) Co-Authored-By: Claude Opus 4.6 (1M context) --- {src => crates/improvise-io/src}/import/analyzer.rs | 0 {src => crates/improvise-io/src}/import/csv_parser.rs | 0 {src => crates/improvise-io/src}/import/mod.rs | 0 {src => crates/improvise-io/src}/import/wizard.rs | 0 crates/improvise-io/src/lib.rs | 5 +++-- {src => crates/improvise-io/src}/persistence/improv.pest | 0 {src => crates/improvise-io/src}/persistence/mod.rs | 0 examples/gen-grammar.rs | 3 ++- src/lib.rs | 4 ++-- 9 files changed, 7 insertions(+), 5 deletions(-) rename {src => crates/improvise-io/src}/import/analyzer.rs (100%) rename {src => crates/improvise-io/src}/import/csv_parser.rs (100%) rename {src => crates/improvise-io/src}/import/mod.rs (100%) rename {src => crates/improvise-io/src}/import/wizard.rs (100%) rename {src => crates/improvise-io/src}/persistence/improv.pest (100%) rename {src => crates/improvise-io/src}/persistence/mod.rs (100%) diff --git a/src/import/analyzer.rs b/crates/improvise-io/src/import/analyzer.rs similarity index 100% rename from src/import/analyzer.rs rename to crates/improvise-io/src/import/analyzer.rs diff --git a/src/import/csv_parser.rs b/crates/improvise-io/src/import/csv_parser.rs similarity index 100% rename from src/import/csv_parser.rs rename to crates/improvise-io/src/import/csv_parser.rs diff --git a/src/import/mod.rs b/crates/improvise-io/src/import/mod.rs similarity index 100% rename from src/import/mod.rs rename to crates/improvise-io/src/import/mod.rs diff --git a/src/import/wizard.rs b/crates/improvise-io/src/import/wizard.rs similarity index 100% rename from src/import/wizard.rs rename to crates/improvise-io/src/import/wizard.rs diff --git a/crates/improvise-io/src/lib.rs b/crates/improvise-io/src/lib.rs index 9bdd4fb..4547ce5 100644 --- a/crates/improvise-io/src/lib.rs +++ b/crates/improvise-io/src/lib.rs @@ -9,7 +9,8 @@ //! Re-exports the core modules under their conventional names so code in //! this crate can keep using `crate::model::*`, `crate::view::*`, //! `crate::workbook::*`, `crate::format::*`, and `crate::formula::*` paths. -//! -//! Scaffolded empty in this commit; the modules land in the next commit. pub use improvise_core::{format, model, view, workbook}; pub use improvise_formula as formula; + +pub mod import; +pub mod persistence; diff --git a/src/persistence/improv.pest b/crates/improvise-io/src/persistence/improv.pest similarity index 100% rename from src/persistence/improv.pest rename to crates/improvise-io/src/persistence/improv.pest diff --git a/src/persistence/mod.rs b/crates/improvise-io/src/persistence/mod.rs similarity index 100% rename from src/persistence/mod.rs rename to crates/improvise-io/src/persistence/mod.rs diff --git a/examples/gen-grammar.rs b/examples/gen-grammar.rs index 56a2a6e..9e980f5 100644 --- a/examples/gen-grammar.rs +++ b/examples/gen-grammar.rs @@ -21,7 +21,8 @@ use pest_meta::ast::{Expr, RuleType}; use pest_meta::parser; use std::collections::HashMap; -const GRAMMAR: &str = include_str!("../src/persistence/improv.pest"); +const GRAMMAR: &str = + include_str!("../crates/improvise-io/src/persistence/improv.pest"); fn load_grammar() -> HashMap { let pairs = parser::parse(parser::Rule::grammar_rules, GRAMMAR) diff --git a/src/lib.rs b/src/lib.rs index 642b696..ae50bf2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,9 +2,9 @@ pub mod command; pub mod draw; pub use improvise_core::format; pub use improvise_formula as formula; -pub mod import; +pub use improvise_io::import; pub use improvise_core::model; -pub mod persistence; +pub use improvise_io::persistence; pub mod ui; pub use improvise_core::view; pub use improvise_core::workbook;