1use std::thread;
2use std::time::{Duration, SystemTime, UNIX_EPOCH};
3
4pub const DOOM_TS: u64 = 2_147_483_647;
15
16pub const SECONDS_IN_MINUTE: u64 = 60;
18pub const SECONDS_IN_HOUR: u64 = 3600;
20pub const SECONDS_IN_DAY: u64 = 86_400; pub const SECONDS_IN_YEAR: u64 = 31_536_000; pub fn time_left() -> Duration {
44 let now = SystemTime::now()
45 .duration_since(UNIX_EPOCH)
46 .expect("Time went backwards");
47 Duration::from_secs(DOOM_TS.saturating_sub(now.as_secs()))
48}
49
50pub fn print_time_left(duration: Duration) {
64 let total_seconds = duration.as_secs();
65
66 if total_seconds >= SECONDS_IN_YEAR {
67 let years = total_seconds / SECONDS_IN_YEAR;
68 let remaining_seconds = total_seconds % SECONDS_IN_YEAR;
69
70 let days = remaining_seconds / SECONDS_IN_DAY;
71 let remaining_seconds = remaining_seconds % SECONDS_IN_DAY;
72
73 let hours = remaining_seconds / SECONDS_IN_HOUR;
74 let remaining_seconds = remaining_seconds % SECONDS_IN_HOUR;
75
76 let minutes = remaining_seconds / SECONDS_IN_MINUTE;
77 let seconds = remaining_seconds % SECONDS_IN_MINUTE;
78
79 println!(
80 "{} years, {} days, {} hours, {} minutes, {} seconds",
81 years, days, hours, minutes, seconds
82 );
83 } else if total_seconds >= SECONDS_IN_DAY {
84 let days = total_seconds / SECONDS_IN_DAY;
85 let remaining_seconds = total_seconds % SECONDS_IN_DAY;
86
87 let hours = remaining_seconds / SECONDS_IN_HOUR;
88 let remaining_seconds = remaining_seconds % SECONDS_IN_HOUR;
89
90 let minutes = remaining_seconds / SECONDS_IN_MINUTE;
91 let seconds = remaining_seconds % SECONDS_IN_MINUTE;
92
93 println!(
94 "{} days, {} hours, {} minutes, {} seconds",
95 days, hours, minutes, seconds
96 );
97 } else if total_seconds >= SECONDS_IN_HOUR {
98 let hours = total_seconds / SECONDS_IN_HOUR;
99 let remaining_seconds = total_seconds % SECONDS_IN_HOUR;
100
101 let minutes = remaining_seconds / SECONDS_IN_MINUTE;
102 let seconds = remaining_seconds % SECONDS_IN_MINUTE;
103
104 println!("{} hours, {} minutes, {} seconds", hours, minutes, seconds);
105 } else if total_seconds >= SECONDS_IN_MINUTE {
106 let minutes = total_seconds / SECONDS_IN_MINUTE;
107 let seconds = total_seconds % SECONDS_IN_MINUTE;
108
109 println!("{} minutes, {} seconds", minutes, seconds);
110 } else {
111 println!("{} seconds", total_seconds);
112 }
113}
114
115pub fn doom(countdown: bool) {
136 if countdown {
137 loop {
138 print_time_left(time_left());
139 thread::sleep(Duration::from_secs(1));
140 }
141 } else {
142 print_time_left(time_left());
143 }
144}