measurement_units/lib.rs
1//! # measurement_units
2//! `measurement_units` is a rust library for basic measurements units conversion such as length,
3//! mass, time, volume, percents.
4//!
5//! # Examples
6//! ```
7//! use measurement_units::{convert, Length};
8//! let length_in_centimeters = convert(&1.0, &Length::M, &Length::CM, &Option::None);
9//! assert_eq!(100.0, length_in_centimeters);
10//!
11//! let length_in_meters = convert(&99.5, &Length::CM, &Length::M, &Some(0_u32));
12//! assert_eq!(1.0, length_in_meters);
13//! ```
14
15mod util;
16mod units;
17
18pub use units::length::Length;
19pub use units::mass::Mass;
20pub use units::time::Time;
21pub use units::volume::Volume;
22pub use units::percent::Percent;
23
24/// Main trait implements list of conversion coefficients for measurement units.
25pub trait Convertable {
26 fn conversion_coefficient(&self) -> f64;
27}
28
29/// Converts measurement unit from one to another using coefficients specified by the Convertable
30/// trait in the conversion_coefficient method.
31/// Precision argument defines number of decimal digits to roundup the result.
32///
33/// # Examples
34/// ```
35/// use measurement_units::{convert, Length};
36/// let length_in_centimeters = convert(&1.0, &Length::M, &Length::CM, &Option::None);
37/// assert_eq!(100.0, length_in_centimeters);
38///
39/// let length_in_meters = convert(&99.5, &Length::CM, &Length::M, &Some(0_u32));
40/// assert_eq!(1.0, length_in_meters);
41/// ```
42pub fn convert<T>(value: &f64, from: &T, to: &T, precision: &Option<u32>) -> f64
43where T: Convertable + PartialEq
44{
45 let mut result = *value;
46 if from != to {
47 result *= from.conversion_coefficient() / to.conversion_coefficient();
48 }
49
50 match precision {
51 None => result,
52 Some(precision) => util::round_to_precision(&result, precision)
53 }
54}