From bd686134484069d9b1dedaa997217f3e032746bc Mon Sep 17 00:00:00 2001 From: Jiahao XU Date: Sat, 11 Jun 2022 18:40:21 +1000 Subject: [PATCH] Refactor and add new enum `PkgFmtDecomposed` Signed-off-by: Jiahao XU --- src/fmt.rs | 74 ++++++++++++++++++++++++++++++++++ src/helpers/async_extracter.rs | 2 +- src/lib.rs | 31 ++------------ 3 files changed, 78 insertions(+), 29 deletions(-) create mode 100644 src/fmt.rs diff --git a/src/fmt.rs b/src/fmt.rs new file mode 100644 index 00000000..34a9dc1e --- /dev/null +++ b/src/fmt.rs @@ -0,0 +1,74 @@ +use serde::{Deserialize, Serialize}; +use strum_macros::{Display, EnumString, EnumVariantNames}; + +/// Binary format enumeration +#[derive( + Debug, Copy, Clone, PartialEq, Serialize, Deserialize, Display, EnumString, EnumVariantNames, +)] +#[strum(serialize_all = "snake_case")] +#[serde(rename_all = "snake_case")] +pub enum PkgFmt { + /// Download format is TAR (uncompressed) + Tar, + /// Download format is TGZ (TAR + GZip) + Tgz, + /// Download format is TAR + XZ + Txz, + /// Download format is TAR + Zstd + Tzstd, + /// Download format is Zip + Zip, + /// Download format is raw / binary + Bin, +} + +impl Default for PkgFmt { + fn default() -> Self { + Self::Tgz + } +} + +impl PkgFmt { + /// If self is one of the tar based formats, + /// return Some. + pub fn decompose(self) -> PkgFmtDecomposed { + match self { + PkgFmt::Tar => PkgFmtDecomposed::Tar(TarBasedFmt::Tar), + PkgFmt::Tgz => PkgFmtDecomposed::Tar(TarBasedFmt::Tgz), + PkgFmt::Txz => PkgFmtDecomposed::Tar(TarBasedFmt::Txz), + PkgFmt::Tzstd => PkgFmtDecomposed::Tar(TarBasedFmt::Tzstd), + PkgFmt::Bin => PkgFmtDecomposed::Bin, + PkgFmt::Zip => PkgFmtDecomposed::Zip, + } + } +} + +#[derive(Debug, Copy, Clone, PartialEq)] +pub enum PkgFmtDecomposed { + Tar(TarBasedFmt), + Bin, + Zip, +} + +#[derive(Debug, Copy, Clone, PartialEq)] +pub enum TarBasedFmt { + /// Download format is TAR (uncompressed) + Tar, + /// Download format is TGZ (TAR + GZip) + Tgz, + /// Download format is TAR + XZ + Txz, + /// Download format is TAR + Zstd + Tzstd, +} + +impl From for PkgFmt { + fn from(fmt: TarBasedFmt) -> Self { + match fmt { + TarBasedFmt::Tar => PkgFmt::Tar, + TarBasedFmt::Tgz => PkgFmt::Tgz, + TarBasedFmt::Txz => PkgFmt::Txz, + TarBasedFmt::Tzstd => PkgFmt::Tzstd, + } + } +} diff --git a/src/helpers/async_extracter.rs b/src/helpers/async_extracter.rs index 7f858a1b..6286eddd 100644 --- a/src/helpers/async_extracter.rs +++ b/src/helpers/async_extracter.rs @@ -12,7 +12,7 @@ use tokio::{ }; use super::{extracter::*, readable_rx::*}; -use crate::{BinstallError, PkgFmt}; +use crate::{BinstallError, PkgFmt, TarBasedFmt}; pub(crate) enum Content { /// Data to write to file diff --git a/src/lib.rs b/src/lib.rs index 0ad83f42..ca2b019a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,6 @@ use std::collections::HashMap; use serde::{Deserialize, Serialize}; -use strum_macros::{Display, EnumString, EnumVariantNames}; pub mod drivers; pub use drivers::*; @@ -18,6 +17,9 @@ pub mod fetchers; mod target; pub use target::*; +mod fmt; +pub use fmt::*; + /// Default package path template (may be overridden in package Cargo.toml) pub const DEFAULT_PKG_URL: &str = "{ repo }/releases/download/v{ version }/{ name }-{ target }-v{ version }.{ archive-format }"; @@ -25,33 +27,6 @@ pub const DEFAULT_PKG_URL: &str = /// Default binary name template (may be overridden in package Cargo.toml) pub const DEFAULT_BIN_DIR: &str = "{ name }-{ target }-v{ version }/{ bin }{ binary-ext }"; -/// Binary format enumeration -#[derive( - Debug, Copy, Clone, PartialEq, Serialize, Deserialize, Display, EnumString, EnumVariantNames, -)] -#[strum(serialize_all = "snake_case")] -#[serde(rename_all = "snake_case")] -pub enum PkgFmt { - /// Download format is TAR (uncompressed) - Tar, - /// Download format is TGZ (TAR + GZip) - Tgz, - /// Download format is TAR + XZ - Txz, - /// Download format is TAR + Zstd - Tzstd, - /// Download format is Zip - Zip, - /// Download format is raw / binary - Bin, -} - -impl Default for PkgFmt { - fn default() -> Self { - Self::Tgz - } -} - /// `binstall` metadata container /// /// Required to nest metadata under `package.metadata.binstall`