summaryrefslogtreecommitdiff
path: root/src/cmds/cmd/sheetdump.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmds/cmd/sheetdump.rs')
-rw-r--r--src/cmds/cmd/sheetdump.rs62
1 files changed, 62 insertions, 0 deletions
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!();