Skip to content

Commit

Permalink
feat: Add more durations, add more impls
Browse files Browse the repository at this point in the history
  • Loading branch information
sirewix committed Dec 23, 2024
1 parent 87d5369 commit 7762eab
Show file tree
Hide file tree
Showing 6 changed files with 139 additions and 17 deletions.
6 changes: 6 additions & 0 deletions src/base_url.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,12 @@ impl BaseUrl {
}
}

impl std::fmt::Display for BaseUrl {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
self.url.fmt(f)
}
}

impl TryFrom<Url> for BaseUrl {
type Error = ();
fn try_from(url: Url) -> Result<Self, Self::Error> {
Expand Down
124 changes: 119 additions & 5 deletions src/duration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,114 @@ crate::define_generic_wrapper! {
}
}

impl Seconds<StdDuration> {
#[allow(missing_docs)]
#[must_use]
pub const fn from_uint(s: u64) -> Self {
Seconds(StdDuration::from_secs(s))
}
}

#[cfg(feature = "time")]
impl Seconds<TimeDuration> {
#[allow(missing_docs)]
#[must_use]
pub const fn from_int(s: i64) -> Self {
Seconds(TimeDuration::seconds(s))
}
}

#[test]
fn test_seconds_std_duration() {
assert_eq!(
serde_json::from_str::<Seconds<StdDuration>>("567").unwrap(),
Seconds(StdDuration::from_secs(567))
Seconds::from_uint(567)
);
}

crate::define_generic_wrapper! {
"Helper wrapper to use in configs to deserialize durations from minutes",
Minutes:

{
StdDuration,
|deserializer| u64::deserialize(deserializer).map(|x| StdDuration::from_secs(x * 60)),
|serializer: S, x: StdDuration| serializer.serialize_u64(x.as_secs() / 60)
},

feature "time";
{
TimeDuration,
|deserializer| i64::deserialize(deserializer).map(TimeDuration::minutes),
|serializer: S, x: TimeDuration| serializer.serialize_i64(x.whole_minutes())
}
}

impl Minutes<StdDuration> {
#[allow(missing_docs)]
#[must_use]
pub const fn from_uint(m: u64) -> Self {
Minutes(StdDuration::from_secs(m * 60))
}
}

#[cfg(feature = "time")]
impl Minutes<TimeDuration> {
#[allow(missing_docs)]
#[must_use]
pub const fn from_int(m: i64) -> Self {
Minutes(TimeDuration::minutes(m))
}
}

#[test]
fn test_minutes_std_duration() {
assert_eq!(
serde_json::from_str::<Minutes<StdDuration>>("567").unwrap(),
Minutes::from_uint(567)
);
}

crate::define_generic_wrapper! {
"Helper wrapper to use in configs to deserialize durations from hours",
Hours:

{
StdDuration,
|deserializer| u64::deserialize(deserializer).map(|x| StdDuration::from_secs(x * 60 * 60)),
|serializer: S, x: StdDuration| serializer.serialize_u64(x.as_secs() / 60 / 60)
},

feature "time";
{
TimeDuration,
|deserializer| i64::deserialize(deserializer).map(TimeDuration::hours),
|serializer: S, x: TimeDuration| serializer.serialize_i64(x.whole_hours())
}
}

impl Hours<StdDuration> {
#[allow(missing_docs)]
#[must_use]
pub const fn from_uint(h: u64) -> Self {
Hours(StdDuration::from_secs(h * 60 * 60))
}
}

#[cfg(feature = "time")]
impl Hours<TimeDuration> {
#[allow(missing_docs)]
#[must_use]
pub const fn from_int(h: i64) -> Self {
Hours(TimeDuration::hours(h))
}
}

#[test]
fn test_hours_std_duration() {
assert_eq!(serde_json::from_str::<Hours<StdDuration>>("567").unwrap(), Hours::from_uint(567));
}

crate::define_generic_wrapper! {
"Helper wrapper to use in configs to deserialize durations from milliseconds",
Ms:
Expand All @@ -61,10 +161,24 @@ crate::define_generic_wrapper! {
}
}

impl Ms<StdDuration> {
#[allow(missing_docs)]
#[must_use]
pub const fn from_uint(ms: u64) -> Self {
Ms(StdDuration::from_millis(ms))
}
}

#[cfg(feature = "time")]
impl Ms<TimeDuration> {
#[allow(missing_docs)]
#[must_use]
pub const fn from_int(ms: i64) -> Self {
Ms(TimeDuration::milliseconds(ms))
}
}

#[test]
fn test_ms_std_duration() {
assert_eq!(
serde_json::from_str::<Ms<StdDuration>>("567").unwrap(),
Ms(StdDuration::from_millis(567))
);
assert_eq!(serde_json::from_str::<Ms<StdDuration>>("567").unwrap(), Ms::from_uint(567));
}
8 changes: 7 additions & 1 deletion src/level_filter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,13 @@ use serde::{de, Deserialize};
/// ```
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[repr(transparent)]
pub struct LevelFilter(tracing::level_filters::LevelFilter);
pub struct LevelFilter(pub tracing::level_filters::LevelFilter);

impl std::fmt::Display for LevelFilter {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
self.0.fmt(f)
}
}

impl<'de> Deserialize<'de> for LevelFilter {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
Expand Down
8 changes: 7 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ macro_rules! define_generic_wrapper {
#[doc = $doc]
#[derive(Debug, PartialEq, Eq, Clone, Default)]
#[repr(transparent)]
pub struct $name<D>(D);
pub struct $name<D>(pub D);

impl<D> $name<D> {
#[allow(missing_docs)]
Expand Down Expand Up @@ -240,6 +240,12 @@ macro_rules! define_generic_wrapper {
}
}

impl<D: std::fmt::Display> std::fmt::Display for $name<D> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
self.0.fmt(f)
}
}

$(
$( #[cfg(feature = $feat)] )?
impl<'de> serde::Deserialize<'de> for $name<$t> {
Expand Down
Empty file removed tests/setup.sh
Empty file.
10 changes: 0 additions & 10 deletions tests/tests.rs

This file was deleted.

0 comments on commit 7762eab

Please sign in to comment.