An open API service indexing awesome lists of open source software.

https://github.com/iddm/diesel-chrono-duration

Adds chrono duration support for the diesel ORM
https://github.com/iddm/diesel-chrono-duration

chrono diesel duration rust

Last synced: about 1 month ago
JSON representation

Adds chrono duration support for the diesel ORM

Awesome Lists containing this project

README

          

# diesel-chrono-duration
[![](https://meritbadge.herokuapp.com/diesel-chrono-duration)](https://crates.io/crates/diesel-chrono-duration) [![](https://travis-ci.org/iddm/diesel-chrono-duration.svg?branch=master)](https://travis-ci.org/iddm/diesel-chrono-duration) ![CI](https://github.com/iddm/diesel-chrono-duration/workflows/CI/badge.svg) [![](https://docs.rs/diesel-chrono-duration/badge.svg)](https://docs.rs/diesel-chrono-duration)
[![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)

This crate adds support for the [`chrono::Duration`](https://docs.rs/chrono/0.4.0/chrono/struct.Duration.html) type into the [`diesel` ORM](http://diesel.rs/).

## Why

Diesel crate has a policy of including only such type implementations which can be represented as is in the SQL types. `chrono::Duration` does not have a direct 1-to-1 mapping in both the `SQLite` and `PostgreSQL`.

## How

The `chrono::Duration` type stores its value as `i64` number. This is exactly 8 bytes and such types are `BigInteger` and `BigInt`. So, the `ToSql` and `FromSql` traits implementation simply uses `chrono::Duration`'s inner
`i64` value.

## Usage

To implement this we added `ChronoDurationProxy` type which is just a strong type as defined as:

```rust
pub struct ChronoDurationProxy(pub chrono::Duration);
```

In your table model you use it instead of `chrono::Duration`:

```rust
extern crate diesel_chrono_duration;

use diesel_chrono_duration::ChronoDurationProxy;

#[derive(Debug, Clone, Queryable, Insertable)]
#[table_name = "sometable"]
pub struct SomeTable {
/// The ID of the record in the table.
pub id: i32,
/// Some duration
pub duration: ChronoDurationProxy,
}
```

Later, when you want to use it's value as `chrono::Duration` you have these options:

- `*duration` returns a reference to the inner `chrono::Duration` object. It is done by the `Deref` trait.
- `&duration` also returns a reference to the inner `chrono::Duration` object. It is done by the `AsRef` trait.
- `duration.0` as in usual rust.

## Contribute

The project is very simple and small but all contributions are "please make a contribution". Thanks in advance.

## License

This project is [licensed under the MIT license](https://github.com/iddm/diesel-chrono-duration/blob/master/LICENSE).