Skip to main content

DV with Rust

crates.iodownloads

The core library is written in Rust, and can be installed via Crates.io or directly from GitHub.

Quickstart

Add DV to your Rust project by adding it to your Cargo.toml:

Cargo.toml
[dependencies]
dv_rs = "*" # Or specify a version like "0.4.0"

Or use cargo to add it:

cargo add dv_rs

Then import and use it in your code:

use dv_rs::DimensionalVariable as dv;
const FAIL_MSG: &str = "Failed!";

// Example
let len = dv::new(2.5, "m").unwrap();
let len_cm = len.value_in("cm").unwrap();
assert_eq!(len_cm, 250.0);

// Bad Example
let d = dv::new(1.0, "m").expect(FAIL_MSG);
let result = d.value_in("h");
assert!(result.is_err());

Example

use dv_rs::DimensionalVariable as dv;
const FAIL_MSG: &str = "Failed!";

// Example
let v = dv::new(3.0, "m/s").expect(FAIL_MSG);
let t = dv::new(2.0, "s").expect(FAIL_MSG);
let d = &v * &t;
assert_eq!(d.value(), 6.0);
assert_eq!(d.unit(), [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]);

// Bad Example
let m = dv::new(1.0, "m").expect(FAIL_MSG);
let s = dv::new(1.0, "s").expect(FAIL_MSG);
assert!(m.try_add(&s).is_err());
assert!(m.try_sub(&s).is_err());

// Bad Example, throws panic
let m = dv::new(1.0, "m").expect(FAIL_MSG);
let s = dv::new(1.0, "s").expect(FAIL_MSG);
let _ = m + s; // should panic due to incompatible units

// Fractional exponents via sqrt and powf
let a = dv::new(9.0, "m^2/s^2").unwrap();
let r = a.sqrt().unwrap();
assert_eq!(r.unit(), [1.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0]);

let b = dv::new(4.0, "m^3").unwrap();
let r2 = b.sqrt().unwrap();
assert_eq!(r2.unit(), [1.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]);

// Angles (radians and degrees)
let angle_rad = dv::new(std::f64::consts::PI, "rad").unwrap();
let angle_deg = dv::new(180.0, "deg").unwrap();
assert_eq!(angle_rad.value_in("rad").unwrap(), angle_deg.value_in("rad").unwrap());

// Trigonometric functions require angle unit (radians or degrees)
use std::f64::consts::PI;
let angle = dv::new(PI / 4.0, "rad").unwrap();
assert!((angle.sin().unwrap() - (PI / 4.0).sin()).abs() < 1e-12);