summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-02-25 10:58:51 +0800
committer魏曹先生 <1992414357@qq.com>2026-02-25 10:58:51 +0800
commitec6fdf88419a7fdad0128f04bb7a0478776974ab (patch)
tree1e44067a7afef878bed9b8b228f6555806e77738
parent6bd344793e5c2e84361475d6e221007ef21faaad (diff)
Add hexdump and sheetdump commands
-rw-r--r--src/cmds/arg/sheetdump.rs11
-rw-r--r--src/cmds/arg/single_file.rs8
-rw-r--r--src/cmds/cmd/hexdump.rs44
-rw-r--r--src/cmds/cmd/sheetdump.rs62
-rw-r--r--src/cmds/cmd/status.rs6
-rw-r--r--src/cmds/collect/empty.rs1
-rw-r--r--src/cmds/collect/sheetdump.rs5
-rw-r--r--src/cmds/collect/single_file.rs3
-rw-r--r--src/cmds/in/empty.rs1
-rw-r--r--src/cmds/in/sheetdump.rs3
-rw-r--r--src/cmds/in/status.rs1
-rw-r--r--src/cmds/out/hex.rs6
-rw-r--r--src/cmds/out/mappings.rs7
-rw-r--r--src/cmds/renderer/hex.rs15
-rw-r--r--src/cmds/renderer/mappings.rs17
15 files changed, 186 insertions, 4 deletions
diff --git a/src/cmds/arg/sheetdump.rs b/src/cmds/arg/sheetdump.rs
new file mode 100644
index 0000000..907b181
--- /dev/null
+++ b/src/cmds/arg/sheetdump.rs
@@ -0,0 +1,11 @@
+use std::path::PathBuf;
+
+use clap::Parser;
+
+#[derive(Parser, Debug)]
+pub struct JVSheetdumpArgument {
+ pub sheet_file: PathBuf,
+
+ #[arg(short, long)]
+ pub sort: bool,
+}
diff --git a/src/cmds/arg/single_file.rs b/src/cmds/arg/single_file.rs
new file mode 100644
index 0000000..4ed9715
--- /dev/null
+++ b/src/cmds/arg/single_file.rs
@@ -0,0 +1,8 @@
+use std::path::PathBuf;
+
+use clap::Parser;
+
+#[derive(Parser, Debug)]
+pub struct JVSingleFileArgument {
+ pub file: PathBuf,
+}
diff --git a/src/cmds/cmd/hexdump.rs b/src/cmds/cmd/hexdump.rs
new file mode 100644
index 0000000..a0f4a21
--- /dev/null
+++ b/src/cmds/cmd/hexdump.rs
@@ -0,0 +1,44 @@
+use crate::{
+ cmd_output,
+ cmds::{
+ arg::single_file::JVSingleFileArgument, collect::single_file::JVSingleFileCollect,
+ r#in::empty::JVEmptyInput, out::hex::JVHexOutput,
+ },
+ systems::cmd::{
+ cmd_system::JVCommandContext,
+ errors::{CmdExecuteError, CmdPrepareError},
+ },
+};
+use cmd_system_macros::exec;
+use tokio::fs;
+
+pub struct JVHexdumpCommand;
+type Cmd = JVHexdumpCommand;
+type Arg = JVSingleFileArgument;
+type In = JVEmptyInput;
+type Collect = JVSingleFileCollect;
+
+fn help_str() -> String {
+ "Hello".to_string()
+}
+
+async fn prepare(_args: &Arg, _ctx: &JVCommandContext) -> Result<In, CmdPrepareError> {
+ Ok(In {})
+}
+
+async fn collect(args: &Arg, _ctx: &JVCommandContext) -> Result<Collect, CmdPrepareError> {
+ let file = &args.file;
+ let data = fs::read(file).await?;
+ Ok(Collect { data })
+}
+
+#[exec]
+async fn exec(
+ _input: In,
+ collect: Collect,
+) -> Result<(Box<dyn std::any::Any + Send + 'static>, String), CmdExecuteError> {
+ let output = JVHexOutput { data: collect.data };
+ cmd_output!(output, JVHexOutput)
+}
+
+crate::command_template!();
diff --git a/src/cmds/cmd/sheetdump.rs b/src/cmds/cmd/sheetdump.rs
new file mode 100644
index 0000000..3b0953a
--- /dev/null
+++ b/src/cmds/cmd/sheetdump.rs
@@ -0,0 +1,62 @@
+use crate::{
+ cmd_output,
+ cmds::{
+ arg::sheetdump::JVSheetdumpArgument, collect::sheetdump::JVSheetdumpCollect,
+ r#in::sheetdump::JVSheetdumpInput, out::mappings::JVMappingsOutput,
+ },
+ systems::cmd::{
+ cmd_system::JVCommandContext,
+ errors::{CmdExecuteError, CmdPrepareError},
+ },
+};
+use cmd_system_macros::exec;
+use just_enough_vcs::system::sheet_system::{
+ mapping::LocalMapping,
+ sheet::{SheetData, error::ReadSheetDataError},
+};
+
+pub struct JVSheetdumpCommand;
+type Cmd = JVSheetdumpCommand;
+type Arg = JVSheetdumpArgument;
+type In = JVSheetdumpInput;
+type Collect = JVSheetdumpCollect;
+
+fn help_str() -> String {
+ todo!()
+}
+
+async fn prepare(args: &Arg, _ctx: &JVCommandContext) -> Result<In, CmdPrepareError> {
+ Ok(In { sort: args.sort })
+}
+
+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),
+ })?;
+
+ Ok(Collect { sheet: sheet })
+}
+
+#[exec]
+async fn exec(
+ input: In,
+ collect: Collect,
+) -> Result<(Box<dyn std::any::Any + Send + 'static>, String), CmdExecuteError> {
+ let mappings = collect.sheet.mappings();
+ let mut mappings_vec = mappings.iter().cloned().collect::<Vec<LocalMapping>>();
+ if input.sort {
+ mappings_vec.sort();
+ }
+
+ let result = JVMappingsOutput {
+ mappings: mappings_vec,
+ };
+ cmd_output!(result, JVMappingsOutput)
+}
+
+crate::command_template!();
diff --git a/src/cmds/cmd/status.rs b/src/cmds/cmd/status.rs
index 4e89d42..c1f2a96 100644
--- a/src/cmds/cmd/status.rs
+++ b/src/cmds/cmd/status.rs
@@ -5,7 +5,7 @@ use crate::{
cmds::{
arg::status::JVStatusArgument,
collect::status::JVStatusCollect,
- r#in::status::JVStatusInput,
+ r#in::empty::JVEmptyInput,
out::status::{JVStatusOutput, JVStatusWrongModifyReason},
},
systems::cmd::{
@@ -22,7 +22,7 @@ use just_enough_vcs::lib::{
pub struct JVStatusCommand;
type Cmd = JVStatusCommand;
type Arg = JVStatusArgument;
-type In = JVStatusInput;
+type In = JVEmptyInput;
type Collect = JVStatusCollect;
fn help_str() -> String {
@@ -30,7 +30,7 @@ fn help_str() -> String {
}
async fn prepare(_args: &Arg, _ctx: &JVCommandContext) -> Result<In, CmdPrepareError> {
- Ok(JVStatusInput)
+ Ok(In {})
}
async fn collect(_args: &Arg, _ctx: &JVCommandContext) -> Result<Collect, CmdPrepareError> {
diff --git a/src/cmds/collect/empty.rs b/src/cmds/collect/empty.rs
new file mode 100644
index 0000000..b28c81d
--- /dev/null
+++ b/src/cmds/collect/empty.rs
@@ -0,0 +1 @@
+pub struct JVEmptyCollect;
diff --git a/src/cmds/collect/sheetdump.rs b/src/cmds/collect/sheetdump.rs
new file mode 100644
index 0000000..c00800d
--- /dev/null
+++ b/src/cmds/collect/sheetdump.rs
@@ -0,0 +1,5 @@
+use just_enough_vcs::system::sheet_system::sheet::SheetData;
+
+pub struct JVSheetdumpCollect {
+ pub sheet: SheetData,
+}
diff --git a/src/cmds/collect/single_file.rs b/src/cmds/collect/single_file.rs
new file mode 100644
index 0000000..92c2829
--- /dev/null
+++ b/src/cmds/collect/single_file.rs
@@ -0,0 +1,3 @@
+pub struct JVSingleFileCollect {
+ pub data: Vec<u8>,
+}
diff --git a/src/cmds/in/empty.rs b/src/cmds/in/empty.rs
new file mode 100644
index 0000000..263ec70
--- /dev/null
+++ b/src/cmds/in/empty.rs
@@ -0,0 +1 @@
+pub struct JVEmptyInput;
diff --git a/src/cmds/in/sheetdump.rs b/src/cmds/in/sheetdump.rs
new file mode 100644
index 0000000..7c636e5
--- /dev/null
+++ b/src/cmds/in/sheetdump.rs
@@ -0,0 +1,3 @@
+pub struct JVSheetdumpInput {
+ pub sort: bool,
+}
diff --git a/src/cmds/in/status.rs b/src/cmds/in/status.rs
deleted file mode 100644
index 859ccd2..0000000
--- a/src/cmds/in/status.rs
+++ /dev/null
@@ -1 +0,0 @@
-pub struct JVStatusInput;
diff --git a/src/cmds/out/hex.rs b/src/cmds/out/hex.rs
new file mode 100644
index 0000000..69e2b37
--- /dev/null
+++ b/src/cmds/out/hex.rs
@@ -0,0 +1,6 @@
+use serde::Serialize;
+
+#[derive(Serialize)]
+pub struct JVHexOutput {
+ pub data: Vec<u8>,
+}
diff --git a/src/cmds/out/mappings.rs b/src/cmds/out/mappings.rs
new file mode 100644
index 0000000..69c8cd0
--- /dev/null
+++ b/src/cmds/out/mappings.rs
@@ -0,0 +1,7 @@
+use just_enough_vcs::system::sheet_system::mapping::LocalMapping;
+use serde::Serialize;
+
+#[derive(Serialize)]
+pub struct JVMappingsOutput {
+ pub mappings: Vec<LocalMapping>,
+}
diff --git a/src/cmds/renderer/hex.rs b/src/cmds/renderer/hex.rs
new file mode 100644
index 0000000..b9a593a
--- /dev/null
+++ b/src/cmds/renderer/hex.rs
@@ -0,0 +1,15 @@
+use just_enough_vcs::utils::hex_display::hex_display_vec;
+use render_system_macros::result_renderer;
+
+use crate::{
+ cmds::out::hex::JVHexOutput,
+ r_println,
+ systems::{cmd::errors::CmdRenderError, render::renderer::JVRenderResult},
+};
+
+#[result_renderer(JVHexRenderer)]
+pub async fn render(data: &JVHexOutput) -> Result<JVRenderResult, CmdRenderError> {
+ let mut r = JVRenderResult::default();
+ r_println!(r, "{}", hex_display_vec(data.data.clone()));
+ Ok(r)
+}
diff --git a/src/cmds/renderer/mappings.rs b/src/cmds/renderer/mappings.rs
new file mode 100644
index 0000000..5de96c0
--- /dev/null
+++ b/src/cmds/renderer/mappings.rs
@@ -0,0 +1,17 @@
+use render_system_macros::result_renderer;
+
+use crate::{
+ cmds::out::mappings::JVMappingsOutput,
+ r_println,
+ systems::{cmd::errors::CmdRenderError, render::renderer::JVRenderResult},
+};
+
+#[result_renderer(JVMappingsRenderer)]
+pub async fn render(data: &JVMappingsOutput) -> Result<JVRenderResult, CmdRenderError> {
+ let mut r = JVRenderResult::default();
+ let mappings = &data.mappings;
+ for m in mappings {
+ r_println!(r, "{}", m)
+ }
+ Ok(r)
+}