From 8cbba8dc8900b98e23e6ee38d6f02537ba936c1c Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Tue, 30 Jun 2026 06:01:32 +0800 Subject: refactor(rola-cli): replace GeneralRenderer with StructuralRenderer and use public modules --- rola-cli/Cargo.toml | 11 ++++++---- rola-cli/build.rs | 3 ++- rola-cli/src/bin/rola.rs | 7 ++++--- rola-cli/src/bucket_mgr.rs | 7 +++---- rola-cli/src/bucket_mgr/bind.rs | 7 ++----- rola-cli/src/bucket_mgr/bind/chains.rs | 34 +++++++++++++++---------------- rola-cli/src/bucket_mgr/bind/renderers.rs | 2 +- rola-cli/src/bucket_mgr/config.rs | 3 +++ rola-cli/src/bucket_mgr/creation.rs | 8 +++----- rola-cli/src/error.rs | 10 ++++----- rola-cli/src/error/space.rs | 20 +++++------------- rola-cli/src/lib.rs | 8 ++------ rola-cli/src/output.rs | 3 +-- rola-cli/src/output/setup.rs | 21 +++++++++++-------- 14 files changed, 66 insertions(+), 78 deletions(-) create mode 100644 rola-cli/src/bucket_mgr/config.rs (limited to 'rola-cli') diff --git a/rola-cli/Cargo.toml b/rola-cli/Cargo.toml index c9cf562..8ecc0f9 100644 --- a/rola-cli/Cargo.toml +++ b/rola-cli/Cargo.toml @@ -25,22 +25,25 @@ clap = { version = "4.6.1", features = ["derive"] } [dependencies.mingling] git = "https://github.com/mingling-rs/mingling.git" -rev = "4be889ac2dc5263ce03bb014de24916bee2e9aa8" +rev = "3888feded3cb83865d6161de642a1a298a7a5835" features = [ "parser", "extra_macros", "dispatch_tree", "comp", "clap", - "general_renderer" + "structural_renderer", + "pathf" ] [build-dependencies.mingling] git = "https://github.com/mingling-rs/mingling.git" -rev = "4be889ac2dc5263ce03bb014de24916bee2e9aa8" +rev = "3888feded3cb83865d6161de642a1a298a7a5835" features = [ "builds", - "comp" + "comp", + "dispatch_tree", + "pathf", ] [build-dependencies] diff --git a/rola-cli/build.rs b/rola-cli/build.rs index a409a17..e49c689 100644 --- a/rola-cli/build.rs +++ b/rola-cli/build.rs @@ -1,11 +1,12 @@ use std::path::Path; use std::process::Command; -use mingling::build::build_comp_scripts; +use mingling::build::{analyze_and_build_type_mapping, build_comp_scripts}; fn main() { build_version_info(); build_completion(); + analyze_and_build_type_mapping().unwrap(); } fn build_version_info() { diff --git a/rola-cli/src/bin/rola.rs b/rola-cli/src/bin/rola.rs index 3e97468..635aa7d 100644 --- a/rola-cli/src/bin/rola.rs +++ b/rola-cli/src/bin/rola.rs @@ -3,11 +3,12 @@ use std::{env::current_dir, process::exit}; use mingling::{ LazyInit, Program, macros::program_setup, - setup::{ExitCodeSetup, GeneralRendererSetup, HelpFlagSetup, QuietFlagSetup}, + setup::{ExitCodeSetup, HelpFlagSetup, QuietFlagSetup, StructuralRendererSetup}, }; use rola_cli::{ ThisProgram, locale, - output::{ColorOutputSetup, EnvLoggerSetup}, + output::setup::ColorOutputSetup, + output::setup::EnvLoggerSetup, res::{bucket::ResBucketWithoutProtocol, current_dir::ResCurrentDir, overwrite::ResOverwrite}, }; @@ -39,7 +40,7 @@ fn main() { program.with_resource(ResBucketWithoutProtocol::lazy_default()); // Setup - program.with_setup(GeneralRendererSetup); + program.with_setup(StructuralRendererSetup); program.with_setup(HelpFlagSetup::new(["-h", "--help"])); program.with_setup(StandardOutputSetup); program.with_setup(ExitCodeSetup::default()); diff --git a/rola-cli/src/bucket_mgr.rs b/rola-cli/src/bucket_mgr.rs index 82a76d4..db7a6dd 100644 --- a/rola-cli/src/bucket_mgr.rs +++ b/rola-cli/src/bucket_mgr.rs @@ -1,4 +1,3 @@ -mod creation; -pub use creation::*; -mod bind; -pub use bind::*; +pub mod bind; +pub mod config; +pub mod creation; diff --git a/rola-cli/src/bucket_mgr/bind.rs b/rola-cli/src/bucket_mgr/bind.rs index fefebd6..a334258 100644 --- a/rola-cli/src/bucket_mgr/bind.rs +++ b/rola-cli/src/bucket_mgr/bind.rs @@ -5,11 +5,8 @@ use mingling::{ use rorolala::bucket::bind::BucketBind; use serde::Serialize; -mod chains; -pub use chains::*; - -mod renderers; -pub use renderers::*; +pub mod chains; +pub mod renderers; pub const EC_BUCKET_BIND_INDEX_NOT_PROVIDED: i32 = 251; pub const EC_BUCKET_BIND_INDEX_NOT_FOUND: i32 = 252; diff --git a/rola-cli/src/bucket_mgr/bind/chains.rs b/rola-cli/src/bucket_mgr/bind/chains.rs index 881e5ba..b8037e2 100644 --- a/rola-cli/src/bucket_mgr/bind/chains.rs +++ b/rola-cli/src/bucket_mgr/bind/chains.rs @@ -1,16 +1,20 @@ use crate::{ Next, - bucket_mgr::{ + bucket_mgr::bind::{ EntryBucketBind, ErrorBucketBindIndexNotFound, ErrorBucketBindIndexNotProvided, ResultAllBucketBind, ResultBucketOperated, ResultEnumBucketOperation::{self, Set}, ResultOneBucketBind, StateBucketBindListAll, StateBucketBindListSpecified, StateBucketBindRemove, StateBucketBindSet, }, - error::{ErrorRequireOverwrite, ErrorSpace}, + error::require_overwrite::ErrorRequireOverwrite, + error::space::ErrorSpace, res::{bucket::ResBucketWithoutProtocol, overwrite::ResOverwrite}, }; -use mingling::{LazyRes, macros::chain}; +use mingling::{ + Groupped, LazyRes, + macros::{chain, route}, +}; use rorolala::bucket::{self}; use shared_functions::info; @@ -55,10 +59,10 @@ pub fn handle_state_bucket_bind_set( let (index, url) = set.inner; let bucket_space_ref = &bucket.get_ref().space; - let exist = match bucket::bind::check_bucket_bind_exists(bucket_space_ref, index) { - Ok(exists) => exists, - Err(e) => return ErrorSpace::from(e).to_chain(), - }; + let exist = route!(bucket::bind::check_bucket_bind_exists( + bucket_space_ref, + index + )); // When the bind already exists but overwrite is not specified // Dispatch to ErrorRequireOverwrite @@ -88,9 +92,7 @@ pub fn handle_state_bucket_bind_remove( let index = remove.inner; let bucket_space_ref = &bucket.get_ref().space; - if let Err(space_error) = bucket::bind::remove_bucket_bind(bucket_space_ref, index) { - return ErrorSpace::from(space_error).to_chain(); - } + route!(bucket::bind::remove_bucket_bind(bucket_space_ref, index)); ResultBucketOperated { operation: ResultEnumBucketOperation::Remove, @@ -107,10 +109,9 @@ pub fn handle_state_bucket_bind_list_specified( ) -> Next { let index = index.inner; let bucket_space_ref = &bucket.get_ref().space; - let bind_info = match bucket::bind::read_bucket_bind(bucket_space_ref, index) { - Err(e) => return ErrorSpace::from(e).to_chain(), - Ok(None) => return ErrorBucketBindIndexNotFound::new(index).to_render(), - Ok(Some(r)) => r, + let bind_info = match route!(bucket::bind::read_bucket_bind(bucket_space_ref, index)) { + None => return ErrorBucketBindIndexNotFound::new(index).to_render(), + Some(r) => r, }; ResultOneBucketBind { @@ -127,10 +128,7 @@ pub fn handle_state_bucket_bind_list_all( ) -> Next { let bucket_space_ref = &bucket.get_ref().space; info!("Reading all bucket binds from space"); - let bind_list = match bucket::bind::read_bucket_binds(bucket_space_ref) { - Err(e) => return ErrorSpace::from(e).to_chain(), - Ok(r) => r, - }; + let bind_list = route!(bucket::bind::read_bucket_binds(bucket_space_ref)); info!("Read {} bucket binds", bind_list.len()); ResultAllBucketBind { bind_list }.to_render() } diff --git a/rola-cli/src/bucket_mgr/bind/renderers.rs b/rola-cli/src/bucket_mgr/bind/renderers.rs index 18ae092..cf12b7f 100644 --- a/rola-cli/src/bucket_mgr/bind/renderers.rs +++ b/rola-cli/src/bucket_mgr/bind/renderers.rs @@ -4,7 +4,7 @@ use mingling::{ }; use crate::{ - bucket_mgr::{ + bucket_mgr::bind::{ EC_BUCKET_BIND_INDEX_NOT_FOUND, EC_BUCKET_BIND_INDEX_NOT_PROVIDED, ErrorBucketBindIndexNotFound, ErrorBucketBindIndexNotProvided, ResultAllBucketBind, ResultBucketOperated, ResultEnumBucketOperation, ResultOneBucketBind, diff --git a/rola-cli/src/bucket_mgr/config.rs b/rola-cli/src/bucket_mgr/config.rs new file mode 100644 index 0000000..b30620b --- /dev/null +++ b/rola-cli/src/bucket_mgr/config.rs @@ -0,0 +1,3 @@ +use mingling::macros::dispatcher; + +dispatcher!("bucket.config"); diff --git a/rola-cli/src/bucket_mgr/creation.rs b/rola-cli/src/bucket_mgr/creation.rs index 2394228..fd794e8 100644 --- a/rola-cli/src/bucket_mgr/creation.rs +++ b/rola-cli/src/bucket_mgr/creation.rs @@ -10,7 +10,7 @@ use rorolala::bucket::{Bucket, NoProtocol}; use serde::Serialize; use space_system::{Space, SpaceError, SpaceRoot, find_space_root_with}; -use crate::{Next, error::ErrorIo, locale::I18nBucketManager, res::current_dir::ResCurrentDir}; +use crate::{Next, error::io::ErrorIo, locale::I18nBucketManager, res::current_dir::ResCurrentDir}; pub const EC_BUCKET_CREATE_DIR_NOT_EMPTY: i32 = 2400; pub const EC_BUCKET_PATH_NOT_PROVIDED: i32 = 2401; @@ -46,7 +46,7 @@ pub fn handle_bucket_init(_args: EntryBucketInit, cwd: &mut ResCurrentDir) -> Ne pub fn handle_bucket_create(args: EntryBucketCreate) -> Next { let join = route! { args.pick_or_route::((), - ErrorBucketPathNotProvided::new(()).to_render() + ErrorBucketPathNotProvided::new(()) ).unpack() }; StateBucketCreationPrecheck::new(join).to_chain() @@ -80,9 +80,7 @@ pub fn handle_state_bucket_creation_precheck(create: StateBucketCreationPrecheck pub fn handle_state_bucket_creation(create: StateBucketCreation) -> Next { let path = create.inner; - route! { - create_dir_all(&path).map_err(|e| ErrorIo::from(e).to_render()) - }; + route!(create_dir_all(&path).map_err(|e| ErrorIo::from(e))); // Use a protocol-less Bucket as a temporary Space for initialization let bucket_space = Space::>::new(Bucket::::new_local()); diff --git a/rola-cli/src/error.rs b/rola-cli/src/error.rs index 15bdc70..3271744 100644 --- a/rola-cli/src/error.rs +++ b/rola-cli/src/error.rs @@ -1,6 +1,4 @@ -mod io; -pub use io::*; -mod space; -pub use space::*; -mod require_overwrite; -pub use require_overwrite::*; +pub mod io; +pub mod require_overwrite; +pub mod space; + \ No newline at end of file diff --git a/rola-cli/src/error/space.rs b/rola-cli/src/error/space.rs index fb0a560..b4a011d 100644 --- a/rola-cli/src/error/space.rs +++ b/rola-cli/src/error/space.rs @@ -1,26 +1,22 @@ use mingling::{ Groupped, - macros::{chain, r_println, renderer}, + macros::{chain, group, r_println, renderer}, res::ResExitCode, }; -use serde::Serialize; use space_system::SpaceError; -use crate::{Next, error::ErrorIo, locale::errors::I18nSpaceError}; +use crate::{Next, error::io::ErrorIo, locale::errors::I18nSpaceError}; pub const EC_SPACE_NOT_FOUND: i32 = 2600; pub const EC_SPACE_PATH_FORMAT: i32 = 2601; pub const EC_SPACE_REQUIRE_EMPTY_DIR: i32 = 2602; pub const EC_SPACE_CONFIG_ALREADY_EXIST: i32 = 2603; -#[derive(Serialize, Groupped)] -pub struct ErrorSpace { - pub error: SpaceError, -} +group!(ErrorSpace = SpaceError); #[chain] pub fn handle_error_space(err: ErrorSpace) -> Next { - match err.error { + match err { // Forward to ErrorIo SpaceError::Io(error) => ErrorIo::from(error).to_render(), @@ -30,7 +26,7 @@ pub fn handle_error_space(err: ErrorSpace) -> Next { #[renderer] pub fn render_error_space(err: ErrorSpace, ec: &mut ResExitCode) { - match &err.error { + match &err { SpaceError::SpaceNotFound => { r_println!("{}", I18nSpaceError::space_not_found().trim()); ec.exit_code = EC_SPACE_NOT_FOUND; @@ -56,9 +52,3 @@ pub fn render_error_space(err: ErrorSpace, ec: &mut ResExitCode) { } } } - -impl From for ErrorSpace { - fn from(error: SpaceError) -> Self { - Self { error } - } -} diff --git a/rola-cli/src/lib.rs b/rola-cli/src/lib.rs index b472169..02c479a 100644 --- a/rola-cli/src/lib.rs +++ b/rola-cli/src/lib.rs @@ -5,16 +5,12 @@ use mingling::{ res::ResExitCode, }; +pub mod bucket_mgr; +pub mod error; pub mod output; pub mod res; pub mod tokio_wrapper; -mod bucket_mgr; -use bucket_mgr::*; - -mod error; -use error::*; - use crate::output::display::markdown; pub const EC_COMMAND_NOT_FOUND: i32 = 1000; diff --git a/rola-cli/src/output.rs b/rola-cli/src/output.rs index 65cafed..3e93bd7 100644 --- a/rola-cli/src/output.rs +++ b/rola-cli/src/output.rs @@ -2,5 +2,4 @@ pub mod ansi_control; pub mod display; pub mod env_logger; -mod setup; -pub use setup::*; +pub mod setup; diff --git a/rola-cli/src/output/setup.rs b/rola-cli/src/output/setup.rs index 880b236..8e04eb9 100644 --- a/rola-cli/src/output/setup.rs +++ b/rola-cli/src/output/setup.rs @@ -39,15 +39,20 @@ pub fn env_logger_setup(program: &mut Program) { // Add Hook program.with_hook( ProgramHook::::empty() - .on_begin(|| info!("[INFO] Program is begin")) - .on_pre_dispatch(|args| info!("[INFO] Pre dispatch: {args:?}")) - .on_post_dispatch(|c: &_| info!("[INFO] Post dispatch: {c:?}")) - .on_pre_chain(|c: &_, _| { - info!("[INFO] Pre chain: {c}"); + .on_begin::<_, ()>(|_| println!("[DEBUG] Program is begin")) + .on_pre_dispatch(|info| { + println!("[DEBUG] Pre dispatch: {}", info.arguments.join(" ")) }) - .on_post_chain(|any_output| info!("[INFO] Post chain: {}", any_output.member_id)) - .on_pre_render(|c: &_, _| info!("[INFO] Pre render: {c}")) - .on_post_render(|_| info!("[INFO] Post render")), + .on_post_dispatch(|info| println!("[DEBUG] Post dispatch: {}", info.entry)) + .on_pre_chain(|info| { + println!("[DEBUG] Pre chain: {}", info.input); + }) + .on_post_chain(|info| println!("[DEBUG] Post chain: {}", info.output.member_id)) + .on_finish(|_| { + println!("[DEBUG] Loop end"); + }) + .on_pre_render(|info| println!("[DEBUG] Pre render: {}", info.input)) + .on_post_render(|_| println!("[DEBUG] Post render")), ); } -- cgit