serde-duration-ext

Crates.ioserde-duration-ext
lib.rsserde-duration-ext
version0.1.0
sourcesrc
created_at2024-02-09 08:28:53.987542
updated_at2024-02-09 08:28:53.987542
descriptionSerde support for std::time::Duration and chrono::Duration (chrono feature)
homepage
repository
max_upload_size
id1133618
size20,076
Maxim Fischuk (MaximFischuk)

documentation

README

Serde support for Duration and chrono::Duration

Installation

Add the following to your Cargo.toml:

[dependencies]
serde_duration_ext = "0.1.0"

Also you can enable the chrono feature to support chrono::Duration

[dependencies]
serde_duration_ext = { version = "0.1.0", features = ["chrono"] }

Usage

use serde::{Serialize, Deserialize};
use serde_json;

#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct Foo {
    #[serde(with = "serde_duration_ext")]
    duration: std::time::Duration,
}

fn main() {
    let foo = Foo {
        duration: std::time::Duration::from_secs(123),
    };
    let json = serde_json::to_string(&foo).unwrap();
    assert_eq!(json, r#"{"duration":"123s"}"#);

    let foo2: Foo = serde_json::from_str(&json).unwrap();
    assert_eq!(foo, foo2);
}

You can also use chrono::Duration if you enable the chrono feature.

use serde::{Serialize, Deserialize};
use serde_json;

#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct Foo {
    #[serde(with = "serde_duration_ext::chrono")]
    duration: chrono::Duration,
}

fn main() {
    let foo = Foo {
        duration: chrono::Duration::seconds(123),
    };
    let json = serde_json::to_string(&foo).unwrap();
    assert_eq!(json, r#"{"duration":"123s"}"#);

    let foo2: Foo = serde_json::from_str(&json).unwrap();
    assert_eq!(foo, foo2);
}

Library also provides useful types such as DurationUnit and TimeUnit

use serde::{Serialize, Deserialize};
use serde_json;

use serde_duration_ext::DurationUnit;

#[derive(Serialize, Deserialize, Debug, PartialEq)]
struct Foo {
    duration: DurationUnit,
}

fn main() {
    let foo = Foo {
        duration: DurationUnit::from_secs(123),
    };
    let json = serde_json::to_string(&foo).unwrap();
    assert_eq!(json, r#"{"duration":"123s"}"#);

    let foo2: Foo = serde_json::from_str(&json).unwrap();
    assert_eq!(foo, foo2);
}
Commit count: 0

cargo fmt