From b6d7705471f0a583f1d115472ddbc8c4f8a420a9 Mon Sep 17 00:00:00 2001 From: Federico Igne Date: Sat, 6 Nov 2021 10:49:12 +0000 Subject: [rust] Space Age --- rust/space-age/src/lib.rs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 rust/space-age/src/lib.rs (limited to 'rust/space-age/src') diff --git a/rust/space-age/src/lib.rs b/rust/space-age/src/lib.rs new file mode 100644 index 0000000..9d24481 --- /dev/null +++ b/rust/space-age/src/lib.rs @@ -0,0 +1,37 @@ +#[derive(Debug)] +pub struct Duration(f64); + +impl From for Duration { + fn from(s: u64) -> Self { + Self(s as f64) + } +} + +pub trait Planet { + const EARTH_SECONDS: f64 = 31557600.; + const SECONDS_IN_YEAR: f64; + fn years_during(d: &Duration) -> f64 { d.0 / Self::SECONDS_IN_YEAR } +} + + +macro_rules! planets { + ( $( $planet:ident -> $ratio:expr ),* ) => { + $( + pub struct $planet; + impl Planet for $planet { + const SECONDS_IN_YEAR: f64 = $ratio * Self::EARTH_SECONDS; + } + )* + } +} + +planets!( + Mercury -> 0.2408467, + Venus -> 0.61519726, + Earth -> 1.0, + Mars -> 1.8808158, + Jupiter -> 11.862615, + Saturn -> 29.447498, + Uranus -> 84.016846, + Neptune -> 164.79132 +); -- cgit v1.2.3