From 1ee67c953c15e20ed0d594d295e46be849718277 Mon Sep 17 00:00:00 2001 From: skymacro111666 Date: Thu, 20 Jun 2024 09:34:05 +0000 Subject: [PATCH] refactor: use enum_dispatch to reduce duplicate code --- src/cli/base64.rs | 11 ++--------- src/cli/csv.rs | 13 ------------- src/cli/http.rs | 10 ++-------- src/cli/mod.rs | 25 ++++--------------------- src/cli/text.rs | 12 ++---------- src/lib.rs | 7 +++---- 6 files changed, 13 insertions(+), 65 deletions(-) diff --git a/src/cli/base64.rs b/src/cli/base64.rs index 42553f9..bda555a 100644 --- a/src/cli/base64.rs +++ b/src/cli/base64.rs @@ -1,12 +1,14 @@ use std::{fmt, str::FromStr}; use clap::Parser; +use enum_dispatch::enum_dispatch; use crate::CmdExector; use super::verify_file; #[derive(Debug, Parser)] +#[enum_dispatch(CmdExector)] pub enum Base64SubCommand { #[command(name = "encode", about = "Encode a string to base64")] Encode(Base64EncodeOpts), @@ -83,12 +85,3 @@ impl CmdExector for Base64DecodeOpts { Ok(()) } } - -impl CmdExector for Base64SubCommand { - async fn execute(self) -> anyhow::Result<()> { - match self { - Base64SubCommand::Encode(opts) => opts.execute().await, - Base64SubCommand::Decode(opts) => opts.execute().await, - } - } -} diff --git a/src/cli/csv.rs b/src/cli/csv.rs index 11c8c7f..8aa6bea 100644 --- a/src/cli/csv.rs +++ b/src/cli/csv.rs @@ -69,16 +69,3 @@ impl fmt::Display for OutputFormat { write!(f, "{}", Into::<&'static str>::into(*self)) } } - -// impl TryFrom<&str> for OutputFormat { -// type Error = anyhow::Error; - -// fn try_from(format: &str) -> Result { -// match format.to_lowercase().as_str() { -// "json" => Ok(OutputFormat::Json), -// "yaml" => Ok(OutputFormat::Yaml), -// "toml" => Ok(OutputFormat::Toml), -// v => anyhow::bail!("Unsupported format {}", v), -// } -// } -// } diff --git a/src/cli/http.rs b/src/cli/http.rs index 2335c5f..8a72928 100644 --- a/src/cli/http.rs +++ b/src/cli/http.rs @@ -2,9 +2,11 @@ use crate::{process_http_serve, CmdExector}; use super::verify_path; use clap::Parser; +use enum_dispatch::enum_dispatch; use std::path::PathBuf; #[derive(Debug, Parser)] +#[enum_dispatch(CmdExector)] pub enum HttpSubCommand { #[command(about = "Serve a directory over HTTP")] Serve(HttpServeOpts), @@ -23,11 +25,3 @@ impl CmdExector for HttpServeOpts { process_http_serve(self.dir, self.port).await } } - -impl CmdExector for HttpSubCommand { - async fn execute(self) -> anyhow::Result<()> { - match self { - HttpSubCommand::Serve(opts) => opts.execute().await, - } - } -} diff --git a/src/cli/mod.rs b/src/cli/mod.rs index 0b64c57..6399477 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -3,18 +3,12 @@ mod csv; mod genpass; mod http; mod text; -use crate::CmdExector; use clap::Parser; +use enum_dispatch::enum_dispatch; use std::path::{Path, PathBuf}; -use self::csv::CsvOpts; -pub use self::{ - base64::{Base64Format, Base64SubCommand}, - csv::OutputFormat, - genpass::GenPassOpts, - http::HttpSubCommand, - text::{TextSignFormat, TextSubCommand}, -}; +// use self::csv::CsvOpts; +pub use self::{base64::*, csv::*, genpass::*, http::*, text::*}; #[derive(Debug, Parser)] #[command(name = "rcli", version, author, about, long_about = None)] @@ -24,6 +18,7 @@ pub struct Opts { } #[derive(Debug, Parser)] +#[enum_dispatch(CmdExector)] pub enum Subcommand { #[command(name = "csv", about = "Show CSV, or convert CSV to other formats")] Csv(CsvOpts), @@ -37,18 +32,6 @@ pub enum Subcommand { Http(HttpSubCommand), } -impl CmdExector for Subcommand { - async fn execute(self) -> anyhow::Result<()> { - match self { - Subcommand::Csv(opts) => opts.execute().await, - Subcommand::GenPass(opts) => opts.execute().await, - Subcommand::Base64(cmd) => cmd.execute().await, - Subcommand::Text(cmd) => cmd.execute().await, - Subcommand::Http(cmd) => cmd.execute().await, - } - } -} - fn verify_file(filename: &str) -> Result { if filename == "-" || Path::new(filename).exists() { Ok(filename.into()) diff --git a/src/cli/text.rs b/src/cli/text.rs index 4f609f6..cbebb31 100644 --- a/src/cli/text.rs +++ b/src/cli/text.rs @@ -5,10 +5,12 @@ use crate::{ }; use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine}; use clap::Parser; +use enum_dispatch::enum_dispatch; use std::{fmt, path::PathBuf, str::FromStr}; use tokio::fs; #[derive(Debug, Parser)] +#[enum_dispatch(CmdExector)] pub enum TextSubCommand { #[command(name = "sign", about = "Sign a message with a private/shared key")] Sign(TextSignOpts), @@ -121,13 +123,3 @@ impl CmdExector for KeyGenerateOpts { Ok(()) } } - -impl CmdExector for TextSubCommand { - async fn execute(self) -> anyhow::Result<()> { - match self { - TextSubCommand::Sign(opts) => opts.execute().await, - TextSubCommand::Verify(opts) => opts.execute().await, - TextSubCommand::Generate(opts) => opts.execute().await, - } - } -} diff --git a/src/lib.rs b/src/lib.rs index 9dded4d..286d7ea 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,14 +1,13 @@ mod cli; mod process; mod utils; -pub use cli::{ - Base64Format, Base64SubCommand, HttpSubCommand, Opts, Subcommand, TextSignFormat, - TextSubCommand, -}; +pub use cli::*; +use enum_dispatch::enum_dispatch; pub use process::*; pub use utils::*; #[allow(async_fn_in_trait)] +#[enum_dispatch] pub trait CmdExector { async fn execute(self) -> anyhow::Result<()>; }