Skip to main content

yatrosci_units/
lib.rs

1// SPDX-License-Identifier: AGPL-3.0-or-later
2//! # scirs-units
3//!
4//! Unit conversion and dimensional analysis for scientific computing.
5//!
6//! This crate provides:
7//! - SI base and derived units
8//! - Common unit conversions
9//! - Dimensional analysis with compile-time checking (optional)
10//! - Physical quantity types with associated units
11//!
12//! ## Usage
13//!
14//! ```rust
15//! use yatrosci_units::prelude::*;
16//!
17//! // Basic unit conversions
18//! let meters = Length::meters(1000.0);
19//! let kilometers = meters.to_kilometers();
20//! assert!((kilometers.value() - 1.0).abs() < 1e-10);
21//!
22//! // Temperature conversions
23//! let celsius = Temperature::celsius(100.0);
24//! let kelvin = celsius.to_kelvin();
25//! assert!((kelvin.value() - 373.15).abs() < 1e-10);
26//! ```
27//!
28//! ## Dimensional Analysis
29//!
30//! The crate supports dimensional analysis to ensure physical correctness:
31//!
32//! ```rust
33//! use yatrosci_units::{Dimension, Quantity};
34//!
35//! // Length dimension: L^1
36//! let length = Quantity::new(5.0, Dimension::length());
37//!
38//! // Area = Length * Length: L^2
39//! let area = length.clone() * length;
40//! assert_eq!(area.dimension().length_power(), 2);
41//! ```
42
43#![warn(missing_docs)]
44
45pub mod conversion;
46pub mod dimension;
47pub mod quantity;
48pub mod si;
49
50// Physical quantity types
51pub mod amount;
52pub mod current;
53pub mod length;
54pub mod luminosity;
55pub mod mass;
56pub mod temperature;
57pub mod time;
58
59// Derived quantities
60pub mod acceleration;
61pub mod electric;
62pub mod energy;
63pub mod force;
64pub mod frequency;
65pub mod power;
66pub mod pressure;
67pub mod velocity;
68
69pub use dimension::Dimension;
70pub use quantity::Quantity;
71
72/// Prelude module for convenient imports
73pub mod prelude {
74    pub use crate::dimension::Dimension;
75    pub use crate::quantity::Quantity;
76
77    pub use crate::amount::Amount;
78    pub use crate::current::Current;
79    pub use crate::length::Length;
80    pub use crate::luminosity::Luminosity;
81    pub use crate::mass::Mass;
82    pub use crate::temperature::Temperature;
83    pub use crate::time::Time;
84
85    pub use crate::acceleration::Acceleration;
86    pub use crate::electric::{Capacitance, Charge, Resistance, Voltage};
87    pub use crate::energy::Energy;
88    pub use crate::force::Force;
89    pub use crate::frequency::Frequency;
90    pub use crate::power::Power;
91    pub use crate::pressure::Pressure;
92    pub use crate::velocity::Velocity;
93}
94
95#[cfg(test)]
96mod tests {
97    use super::prelude::*;
98
99    #[test]
100    fn test_length_conversion() {
101        let m = Length::meters(1000.0);
102        let km = m.to_kilometers();
103        assert!((km.value() - 1.0).abs() < 1e-10);
104    }
105
106    #[test]
107    fn test_temperature_conversion() {
108        let c = Temperature::celsius(0.0);
109        let k = c.to_kelvin();
110        assert!((k.value() - 273.15).abs() < 1e-10);
111    }
112
113    #[test]
114    fn test_dimensional_analysis() {
115        let l = Quantity::new(5.0, Dimension::length());
116        let t = Quantity::new(2.0, Dimension::time());
117        let v = l / t;
118        assert_eq!(v.dimension().length_power(), 1);
119        assert_eq!(v.dimension().time_power(), -1);
120    }
121}