Skip to content

Commit

Permalink
refactor: Add support for long breaks and intervals
Browse files Browse the repository at this point in the history
This commit refactors the code to add support for long breaks and intervals. It introduces a new struct `Interval` with properties such as name, color, duration, and message_done. The `execute_interval` function is modified to handle both short breaks and long breaks based on the `long_break_counter` variable. The code now allows for a specified number of work intervals before triggering a long break. This change improves the flexibility and customization of the interval timer functionality.
  • Loading branch information
miguoliang committed Jun 10, 2024
1 parent 48d801d commit 1844ee8
Showing 1 changed file with 50 additions and 27 deletions.
77 changes: 50 additions & 27 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,46 +11,69 @@ struct Opt {
work_interval: u64,
#[clap(default_value = "5")]
short_break: u64,
#[clap(default_value = "20")]
long_break: u64,
#[clap(default_value = "4")]
long_break_interval: u64,
}

struct Interval {
name: &'static str,
color: &'static str,
duration: u64,
message_done: &'static str,
}

fn main() {
let opt = Opt::parse();
println!("Work interval: {} minute(s)", opt.work_interval);
println!("Short break: {} minute(s)", opt.short_break);
println!("Long break: {} minute(s)", opt.long_break);
println!("Long break interval: {} work intervals", opt.long_break_interval);
println!("Press Ctrl+C to stop the timer\n");

let mut long_break_counter = 0;
loop {
work_interval(opt.work_interval);
break_interval(opt.short_break);
}
}

fn work_interval(work_interval: u64) {
let seconds = work_interval * 60;
let bar = ProgressBar::new(seconds);
bar.set_prefix(format!("{: >10}", "Work"));
bar.set_style(
ProgressStyle::default_bar()
.template("{prefix} {bar:50.blue/gray} {msg}")
.unwrap(),
);
for _ in 0..seconds {
bar.inc(1);
let left = seconds_to_minutes_seconds(seconds - bar.position());
bar.set_message(left + " left");
thread::sleep(Duration::from_secs(1));
execute_interval(Interval {
name: "Work",
color: "blue",
duration: opt.work_interval,
message_done: "Well done!",
});
long_break_counter += 1;
if long_break_counter == opt.long_break_interval {
execute_interval(Interval {
name: "Long break",
color: "green",
duration: opt.long_break,
message_done: "Move on!",
});
long_break_counter = 0;
} else {
execute_interval(Interval {
name: "Short break",
color: "yellow",
duration: opt.short_break,
message_done: "Back to work!",
});
}
}
bar.set_message("Well done!");
bar.finish();
play_sound();
}

fn break_interval(short_break: u64) {
let seconds = short_break * 60;
fn execute_interval(
Interval {
name,
color,
duration,
message_done,
}: Interval,
) {
let seconds = duration * 60;
let bar = ProgressBar::new(seconds);
bar.set_prefix(format!("{: >10}", "Break"));
bar.set_prefix(format!("{: >15}", name));
bar.set_style(
ProgressStyle::default_bar()
.template("{prefix} {bar:50.red/gray} {msg}")
.template(format!("{{prefix}} {{bar:50.{color}/gray}} {{msg}}").as_str())
.unwrap(),
);
for _ in 0..seconds {
Expand All @@ -59,7 +82,7 @@ fn break_interval(short_break: u64) {
bar.set_message(left + " left");
thread::sleep(Duration::from_millis(1000));
}
bar.set_message("Time to work!");
bar.set_message(message_done);
bar.finish();
play_sound();
}
Expand Down

0 comments on commit 1844ee8

Please # to comment.