diff --git a/derive_macro/src/lib.rs b/derive_macro/src/lib.rs index 5a8bc98..410171d 100644 --- a/derive_macro/src/lib.rs +++ b/derive_macro/src/lib.rs @@ -1,5 +1,4 @@ mod merge; -mod unit; use proc_macro::TokenStream; use syn::{DeriveInput, parse_macro_input}; @@ -9,9 +8,3 @@ pub fn merge_derive(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input as DeriveInput); merge::impl_merge_derive(input) } - -#[proc_macro_derive(UnitConversions, attributes(units, error))] -pub fn unit_derive(input: TokenStream) -> TokenStream { - let input = parse_macro_input!(input as DeriveInput); - unit::impl_unit_conversions(input) -} diff --git a/derive_macro/src/merge.rs b/derive_macro/src/merge.rs index bd682f3..83c1fc1 100644 --- a/derive_macro/src/merge.rs +++ b/derive_macro/src/merge.rs @@ -55,4 +55,3 @@ pub fn impl_merge_derive(input: DeriveInput) -> TokenStream { expanded.into() } - diff --git a/src/app/utils/filesize.rs b/src/app/utils/filesize.rs index b83a451..ee51399 100644 --- a/src/app/utils/filesize.rs +++ b/src/app/utils/filesize.rs @@ -1,9 +1,7 @@ -use super::unit::{Unit, UnitDisplay}; -use derive_macro::UnitConversions; +use super::unit::{Unit, UnitDisplay, UnitError}; use std::fmt::Display; -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Default, UnitConversions)] -#[error(UnitError)] +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Default)] pub struct FileSize(Unit); impl FileSize { @@ -18,3 +16,17 @@ impl Display for FileSize { write!(f, "{}", UnitDisplay::new(&self.0, UNITS)) } } + +impl From for FileSize { + fn from(value: u64) -> Self { + Self(Unit::from(value)) + } +} + +impl TryFrom for FileSize { + type Error = UnitError; + + fn try_from(value: i64) -> Result { + Ok(Self(Unit::try_from(value)?)) + } +} diff --git a/src/app/utils/netspeed.rs b/src/app/utils/netspeed.rs index fe99b2e..5355f85 100644 --- a/src/app/utils/netspeed.rs +++ b/src/app/utils/netspeed.rs @@ -1,9 +1,7 @@ -use super::unit::{Unit, UnitDisplay}; -use derive_macro::UnitConversions; +use super::unit::{Unit, UnitDisplay, UnitError}; use std::fmt::Display; -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Default, UnitConversions)] -#[error(UnitError)] +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Default)] pub struct NetSpeed(Unit); impl NetSpeed { @@ -18,3 +16,17 @@ impl Display for NetSpeed { write!(f, "{}", UnitDisplay::new(&self.0, UNITS)) } } + +impl From for NetSpeed { + fn from(value: u64) -> Self { + Self(Unit::from(value)) + } +} + +impl TryFrom for NetSpeed { + type Error = UnitError; + + fn try_from(value: i64) -> Result { + Ok(Self(Unit::try_from(value)?)) + } +} diff --git a/src/app/utils/unit.rs b/src/app/utils/unit.rs index 1fa9e82..2704429 100644 --- a/src/app/utils/unit.rs +++ b/src/app/utils/unit.rs @@ -1,4 +1,3 @@ -use derive_macro::UnitConversions; use std::fmt::Display; use thiserror::Error; @@ -12,8 +11,7 @@ pub enum UnitError { InvalidValue { reason: String }, } -#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Default, UnitConversions)] -#[error(UnitError)] +#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Default)] pub struct Unit(u64); impl Unit { @@ -58,3 +56,20 @@ impl<'a> Display for UnitDisplay<'a> { write!(f, "{:.2} {}", size, self.units[unit_index]) } } + +impl From for Unit { + fn from(value: u64) -> Self { + Self(value) + } +} + +impl TryFrom for Unit { + type Error = UnitError; + + fn try_from(value: i64) -> Result { + if value < 0 { + return Err(UnitError::NegativeValue { value }); + } + Ok(Self(value as u64)) + } +}