# clarion
A library to simplify working with Clarion software data formats by
enabling simple translation to and from the Clarion formats, including
converting Clarion color formats into an RGB format, and date/time into
the formats used/provided by [time](https://crates.io/crates/time).
Clarion date/time formats are all based on integral numbers, represented
within this library as `i32`s. Dates are specified as the number of days
between a given date and the 28th of December, 1800. Times are specified
as the number of centiseconds between a given time and midnight.
The Clarion color format is also an integral number represented by `i32`,
however in practice this number is never below zero or above 16,777,215.
The number is the base-10 representation of a hex number in BGR format,
e.g. 0xBBGGRR, where BB is blue, GG is green and RR is red.
A standard error format is also specified, named `ClarionErr`, which is
used for out-of-range conversion and constructor errors
(`ClarionErr::ConversionOverflowed` and `ClarionErr::OutOfRange`).
## Usage
This library provides four main structs, `ClarionTime`, `ClarionDate`,
`ClarionColor` and `RgbColor`.
`ClarionColor` and `RgbColor` represent colors in the 24-bit RGB color
space, and `ClarionTime`/`ClarionDate` represent time and date values,
respectively. `ClarionDate`, `ClarionTime` and `ClarionColor` types can
be created using the `new()` constructor function, whereas `RgbColor` can
be created using the standard struct initializer syntax:
```rust
// Create a new ClarionTime value (16:34:00).
let c_time = clarion::ClarionTime::new(5964000);
// Create a new ClarionDate value (2022-01-05).
let c_date = clarion::ClarionDate::new(80727);
// Create a new ClarionColor value (white).
let c_color = clarion::ClarionColor::new(16777215)
```
### `ClarionDate`/`ClarionTime`
Date/time types can be freely converted to/from `time` compatible formats
using the `from()`/`try_from()` and/or the `into()`/`try_into()` functions.
```rust
// Convert `Date` into `ClarionDate` using `from()`.
let date = time::macros::date!(2022-01-05);
let c_date = clarion::ClarionDate::from(date);
assert_eq!(c_date.date(), 80727);
// Convert `ClarionDate` into `Date` using `try_from()`.
let c_date = clarion::ClarionDate::new(80727);
let date = time::Date::try_from(c_date)
.expect("Value did not represent a date between Date::MAX and Date::MIN.");
assert_eq!(date, time::macros::date!(2022-01-05));
// Convert `ClarionTime` into `Time` using `into()`.
let c_time = clarion::ClarionTime::new(5964000);
let time: time::Time = c_time.into();
assert_eq!(time, time::macros::time!(16:34:00))
```
The conversion is fully reversible:
```rust
let c_date = clarion::ClarionDate::new(80727);
let date: time::Date = c_date.try_into().unwrap();
let another_c_date: clarion::ClarionDate = date.into();
assert_eq!(another_c_date, c_date);
```
The raw `i32` value can be extracted out of a `ClarionTime` or
`ClarionDate` value by using the `time()` or `date()` functions
of the respective struct.
### `ClarionColor`/`RgbColor`
`ClarionColor` and `RgbColor` can be freely converted between using
the `from()` and `into()` functions.
```rust
// Convert an RgbColor into a ClarionColor.
let color = clarion::RgbColor {red: 255, green: 128, blue: 64};
let c_color = clarion::ClarionColor::from(color);
assert_eq!(c_color.color(), 4227327);
```
```rust
// Convert a ClarionColor into an RgbColor.
let c_color = clarion::ClarionColor::new(4227327).unwrap();
let color = clarion::RgbColor::from(c_color);
let expected_color = clarion::RgbColor {red: 255, green: 128, blue: 64};
assert_eq!(color, expected_color);
```
The integral value of a `ClarionColor` value can be accessed using the
`color()` function:
```rust
let c_color = clarion::ClarionColor::new(4259584).unwrap();
assert_eq!(c_color.color(), 4259584);
```
The underlying `u8` values of an `RgbColor` value can be accessed using
the respective `red`, `green` or `blue` member of the struct:
```rust
let color = clarion::RgbColor { red: 128, green: 64, blue: 0 };
let (red, green, blue) = (color.red, color.green, color.blue);
assert_eq!((red, green, blue), (128, 64, 0));
```
## License
This project is licensed under either of
- Apache License, Version 2.0 or
- MIT license
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in clarion by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.