summaryrefslogtreecommitdiffstats
path: root/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs
new file mode 100644
index 0000000..b3a8853
--- /dev/null
+++ b/src/lib.rs
@@ -0,0 +1,99 @@
+mod macros;
+pub mod metric;
+
+#[cfg(test)]
+mod tests {
+ use crate::metric::*;
+ use crate::metric::Mass;
+ use crate::metric::Time;
+ use crate::metric::Force;
+ use crate::metric::Length;
+ use crate::metric::Pressure;
+ use crate::metric::CelsiusTemperature;
+
+ /*
+ use crate::metric::Unit;
+ use crate::metric::Primitive;
+ */
+
+ fn avg_force(ds: Length, dt: Time, m: Mass) -> Force {
+ let dv = ds / dt;
+ let a = dv / dt;
+ m * a
+ }
+
+ fn main() {
+ let dist = Mile(100.0);
+ let time = Minute(12.5);
+ let mass = Pound(800.0);
+ let force = avg_force(dist, time, mass);
+ let area = Litre(100.0) / Foot(5.0);
+
+ let result = match Bar(0.0).to_si_unit() {
+ Pressure::Base(_, from_si, symbol) => format!("{}[{}]", from_si((force / area).to_si_primitive()), symbol),
+ _ => panic!("not base")
+ };
+
+ println!(
+ "Force on body with mass {m} that moves {d} in {t}: {f}\n\
+ The pressure per {a} is {p}",
+ d = dist, t = time, m = mass, f = force, a = area, p = result
+ );
+ }
+
+ #[test]
+ fn it_works() {
+ println!();
+ main();
+
+ println!();
+ let single = Kilogram(1.0);
+ let mut double = single;
+ double *= 2.0;
+ let mut dived = double;
+ dived /= 2.0;
+
+ println!("single: {}", single);
+ println!("double: {}", double);
+ println!("single * 2.0: {}", single * 2.0);
+ println!("2.0 * single: {}", 2.0 * single);
+ println!("double / 2.0: {}", double / 2.0);
+ println!("dived: {}", dived);
+
+ println!("single + double: {}", single + double);
+
+ println!();
+ let gram = Gram(1000.0);
+ println!("gram: {}", gram);
+ println!("gram * 2.0: {}", gram * 2.0);
+
+ println!();
+ println!("gram + double = {}", gram + double);
+ println!("double + gram = {}", double + gram);
+ println!("gram - double = {}", gram - double);
+ println!("double - gram = {}", double - gram);
+
+ println!();
+ let k = Kelvin(20.0);
+ let c = Celsius(0.0) + k;
+ println!("{}", c);
+
+ println!();
+ let cel = Celsius(20.0);
+ let fah = match Fahrenheit(0.0).to_si_unit() {
+ CelsiusTemperature::Base(_, from_si, symbol) => CelsiusTemperature::Base(cel.to_si_primitive(), from_si, symbol),
+ _ => panic!("non si after to_si() call")
+ };
+ println!("{} = {}", cel, fah);
+
+ println!();
+ let d = Degree(180.0);
+ let rad = Radian(0.0);
+ println!("{}", (rad + d).to_si_primitive() - std::f64::consts::PI);
+
+ println!();
+ let e = Kilocalorie(70.0);
+ let j = KiloJoule(0.0) + e;
+ println!("{} = {}", e, j);
+ }
+} \ No newline at end of file