Skip to content

MaximFischuk/serde-duration-ext

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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);
}