diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-03-19 15:39:02 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-03-19 15:39:02 +0800 |
| commit | 6e0c9967d09a3ab8f0c1fcceb91ea9c7a7a800ed (patch) | |
| tree | 081aab1f329ecff906d71f1091ff6540f0da63a7 /src | |
| parent | 6e7781a62c00b4329e15d9aba365afff4b601128 (diff) | |
Make sheetedit and sheetdump accept stdin or file argument
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmds/arg/sheetdump.rs | 2 | ||||
| -rw-r--r-- | src/cmds/arg/sheetedit.rs | 2 | ||||
| -rw-r--r-- | src/cmds/cmd/sheetdump.rs | 25 | ||||
| -rw-r--r-- | src/cmds/cmd/sheetedit.rs | 31 | ||||
| -rw-r--r-- | src/cmds/converter/read_sheet_data_error.rs | 13 |
5 files changed, 56 insertions, 17 deletions
diff --git a/src/cmds/arg/sheetdump.rs b/src/cmds/arg/sheetdump.rs index abd0d29..4f32ec5 100644 --- a/src/cmds/arg/sheetdump.rs +++ b/src/cmds/arg/sheetdump.rs @@ -4,7 +4,7 @@ use clap::Parser; #[derive(Parser, Debug)] pub struct JVSheetdumpArgument { - pub sheet_file: PathBuf, + pub sheet_file: Option<PathBuf>, #[arg(short, long = "no-sort")] pub no_sort: bool, diff --git a/src/cmds/arg/sheetedit.rs b/src/cmds/arg/sheetedit.rs index 6232ef7..063b011 100644 --- a/src/cmds/arg/sheetedit.rs +++ b/src/cmds/arg/sheetedit.rs @@ -4,7 +4,7 @@ use clap::Parser; #[derive(Parser, Debug)] pub struct JVSheeteditArgument { - pub file: PathBuf, + pub file: Option<PathBuf>, #[arg(short, long)] pub editor: Option<String>, diff --git a/src/cmds/cmd/sheetdump.rs b/src/cmds/cmd/sheetdump.rs index 5877253..badb8fc 100644 --- a/src/cmds/cmd/sheetdump.rs +++ b/src/cmds/cmd/sheetdump.rs @@ -4,8 +4,11 @@ use crate::{ arg::sheetdump::JVSheetdumpArgument, collect::sheetdump::JVSheetdumpCollect, r#in::sheetdump::JVSheetdumpInput, - out::{mappings::JVMappingsOutput, mappings_pretty::JVMappingsPrettyOutput}, + out::{ + mappings::JVMappingsOutput, mappings_pretty::JVMappingsPrettyOutput, none::JVNoneOutput, + }, }, + early_cmd_output, systems::{ cmd::{ cmd_system::{AnyOutput, JVCommandContext}, @@ -38,15 +41,21 @@ async fn prepare(args: &Arg, _ctx: &JVCommandContext) -> Result<In, CmdPrepareEr }) } -async fn collect(args: &Arg, _ctx: &JVCommandContext) -> Result<Collect, CmdPrepareError> { +async fn collect(args: &Arg, ctx: &JVCommandContext) -> Result<Collect, CmdPrepareError> { let mut sheet = SheetData::empty(); - sheet - .full_read(&args.sheet_file) - .await - .map_err(|e| match e { - ReadSheetDataError::IOErr(error) => CmdPrepareError::Io(error), - })?; + let path = match (&args.sheet_file, &ctx.stdin_path) { + (Some(_), Some(stdin)) => stdin, + (Some(file), None) => file, + (None, Some(stdin)) => stdin, + (None, None) => { + return early_cmd_output!(JVNoneOutput => JVNoneOutput); + } + }; + + sheet.full_read(path).await.map_err(|e| match e { + ReadSheetDataError::IOErr(error) => CmdPrepareError::Io(error), + })?; Ok(Collect { sheet: sheet }) } diff --git a/src/cmds/cmd/sheetedit.rs b/src/cmds/cmd/sheetedit.rs index a751a64..730aeb7 100644 --- a/src/cmds/cmd/sheetedit.rs +++ b/src/cmds/cmd/sheetedit.rs @@ -2,8 +2,10 @@ use crate::{ cmd_output, cmds::{ arg::sheetedit::JVSheeteditArgument, collect::single_file::JVSingleFileCollect, + converter::read_sheet_data_error::ReadSheetDataErrorConverter, r#in::sheetedit::JVSheeteditInput, out::none::JVNoneOutput, }, + early_cmd_output, systems::{ cmd::{ cmd_system::{AnyOutput, JVCommandContext}, @@ -34,26 +36,41 @@ async fn help_str() -> String { String::new() } -async fn prepare(args: &Arg, _ctx: &JVCommandContext) -> Result<In, CmdPrepareError> { - let file = fmt_path(args.file.clone()).map_err(|e| match e { +async fn prepare(args: &Arg, ctx: &JVCommandContext) -> Result<In, CmdPrepareError> { + let file_path = args + .file + .as_ref() + .or(ctx.stdin_path.as_ref()) + .ok_or_else(|| { + CmdPrepareError::Error(t!("sheetedit.error.no_file_input").trim().to_string()) + })?; + + let file = fmt_path(file_path.clone()).map_err(|e| match e { PathFormatError::InvalidUtf8(e) => CmdPrepareError::Error(e.to_string()), })?; + let editor = args.editor.clone().unwrap_or(get_default_editor().await); Ok(In { file, editor }) } -async fn collect(args: &Arg, _ctx: &JVCommandContext) -> Result<Collect, CmdPrepareError> { - let data = match tokio::fs::read(&args.file).await { - Ok(d) => d, - Err(_) => Vec::new(), +async fn collect(args: &Arg, ctx: &JVCommandContext) -> Result<Collect, CmdPrepareError> { + let data = match (&args.file, &ctx.stdin_path) { + (_, Some(stdin_path)) => tokio::fs::read(stdin_path) + .await + .map_err(|e| CmdPrepareError::Io(e))?, + (Some(file_path), None) => tokio::fs::read(file_path) + .await + .map_err(|e| CmdPrepareError::Io(e))?, + (None, None) => return early_cmd_output!(JVNoneOutput => JVNoneOutput), }; Ok(Collect { data }) } #[exec] async fn exec(input: In, collect: Collect) -> Result<AnyOutput, CmdExecuteError> { - let sheet = SheetData::try_from(collect.data).unwrap_or(SheetData::empty()); + let sheet = + SheetData::try_from(collect.data).map_err(ReadSheetDataErrorConverter::to_exec_error)?; let mappings = sheet.mappings(); let mut mappings_vec = mappings.iter().cloned().collect::<Vec<LocalMapping>>(); diff --git a/src/cmds/converter/read_sheet_data_error.rs b/src/cmds/converter/read_sheet_data_error.rs new file mode 100644 index 0000000..3a0ff6e --- /dev/null +++ b/src/cmds/converter/read_sheet_data_error.rs @@ -0,0 +1,13 @@ +use just_enough_vcs::system::sheet_system::sheet::error::ReadSheetDataError; + +use crate::systems::cmd::errors::CmdExecuteError; + +pub struct ReadSheetDataErrorConverter; + +impl ReadSheetDataErrorConverter { + pub fn to_exec_error(err: ReadSheetDataError) -> CmdExecuteError { + match err { + ReadSheetDataError::IOErr(error) => CmdExecuteError::Io(error), + } + } +} |
