Skip to content

Commit 19f60a0

Browse files
committed
Refactor creating week with fallback
1 parent 31bd8e0 commit 19f60a0

File tree

2 files changed

+37
-36
lines changed

2 files changed

+37
-36
lines changed

src/cli/commands.rs

Lines changed: 20 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@ impl<'a> CommandClient<'a> {
6060
}
6161

6262
pub(crate) async fn get(&self, week: Option<String>, year: Option<i32>, format: Format) {
63-
let week =
64-
get_week_with_fallback(week, year).unwrap_or_else(|err| exit_with_error!("{err}"));
63+
let week = maybe_parse_week(week, year).unwrap_or_else(|err| exit_with_error!("{err}"));
6564

6665
match format {
6766
Format::Json => self.get_json(&week).await.context("JSON"),
@@ -86,8 +85,7 @@ impl<'a> CommandClient<'a> {
8685
}
8786

8887
let day = get_days(days);
89-
let week =
90-
get_week_with_fallback(week, year).unwrap_or_else(|err| exit_with_error!("{err}"));
88+
let week = maybe_parse_week(week, year).unwrap_or_else(|err| exit_with_error!("{err}"));
9189

9290
self.time_sheet_service
9391
.lock()
@@ -115,8 +113,7 @@ impl<'a> CommandClient<'a> {
115113
exit_with_error!("`--day` is set but no day was provided");
116114
}
117115

118-
let week =
119-
get_week_with_fallback(week, year).unwrap_or_else(|err| exit_with_error!("{err}"));
116+
let week = maybe_parse_week(week, year).unwrap_or_else(|err| exit_with_error!("{err}"));
120117
self.time_sheet_service
121118
.lock()
122119
.await
@@ -143,8 +140,7 @@ impl<'a> CommandClient<'a> {
143140
week: Option<String>,
144141
year: Option<i32>,
145142
) {
146-
let week =
147-
get_week_with_fallback(week, year).unwrap_or_else(|err| exit_with_error!("{err}"));
143+
let week = maybe_parse_week(week, year).unwrap_or_else(|err| exit_with_error!("{err}"));
148144

149145
self.repository
150146
.lock()
@@ -158,8 +154,7 @@ impl<'a> CommandClient<'a> {
158154
}
159155

160156
pub(crate) async fn submit(&mut self, week: Option<String>, year: Option<i32>) {
161-
let week =
162-
get_week_with_fallback(week, year).unwrap_or_else(|err| exit_with_error!("{err}"));
157+
let week = maybe_parse_week(week, year).unwrap_or_else(|err| exit_with_error!("{err}"));
163158

164159
self.repository
165160
.lock()
@@ -180,38 +175,29 @@ fn get_days(days: Option<Days>) -> Days {
180175
})
181176
}
182177

183-
// TODO: refactor this so that it lives on WeekNumber and parse_week calls this instead of
184-
// vice-versa
185-
fn get_week_with_fallback(week: Option<String>, year: Option<i32>) -> anyhow::Result<WeekNumber> {
186-
if let Some(week) = week {
187-
let week = parse_week(week)?;
188-
189-
let week = WeekNumber::new_with_fallback(week, year)?;
190-
Ok(week)
191-
} else {
192-
let week = chrono::Local::now().date_naive().iso_week().week();
193-
let week = week
194-
.try_into()
195-
.expect("Week numbers are always less than 255");
196-
197-
WeekNumber::new_with_fallback(week, year)
198-
}
199-
}
200-
201-
fn parse_week(week: String) -> anyhow::Result<u8> {
202-
let week = match week.trim().to_lowercase().as_str() {
178+
fn parse_week_number(week: String) -> anyhow::Result<u8> {
179+
match week.trim().to_lowercase().as_str() {
203180
"previous" => {
181+
// TODO: make sure that the correct year gets set if we do `previous` on week 1
204182
let today_week_last = chrono::Local::now().date_naive() - chrono::Duration::weeks(1);
205-
let week = today_week_last.iso_week().week();
183+
let week = today_week_last
184+
.iso_week()
185+
.week()
186+
.try_into()
187+
.expect("Week numbers are always less than 255");
188+
206189
info!("Using previous week number: {week}");
207190
Ok(week)
208191
}
209192
number => number
210193
.parse()
211194
.with_context(|| format!("Invalid week number '{week}'")),
212-
}?
213-
.try_into()
214-
.expect("Week numbers are always less than 255");
195+
}
196+
}
197+
198+
fn maybe_parse_week(week: Option<String>, year: Option<i32>) -> anyhow::Result<WeekNumber> {
199+
let week = week.map(parse_week_number).transpose()?;
200+
let week = WeekNumber::new_with_fallback(week, year)?;
215201

216202
Ok(week)
217203
}

src/domain/models/week.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,27 @@ impl WeekNumber {
1515
Ok(Self { number: week, year })
1616
}
1717

18-
pub(crate) fn new_with_fallback(week: u8, year: Option<i32>) -> anyhow::Result<Self> {
18+
fn new_with_year_fallback(week: u8, year: Option<i32>) -> anyhow::Result<Self> {
1919
// Fall back to today's year
20-
let year = year.unwrap_or_else(|| year.unwrap_or_else(|| chrono::Utc::now().year()));
20+
let year = year.unwrap_or_else(|| chrono::Utc::now().year());
2121
WeekNumber::new(week, year)
2222
}
2323

24+
pub(crate) fn new_with_fallback(
25+
week: Option<u8>,
26+
year: Option<i32>,
27+
) -> anyhow::Result<WeekNumber> {
28+
let week = week.unwrap_or_else(|| {
29+
// Fall back to today's week
30+
let this_week = chrono::Local::now().date_naive().iso_week().week();
31+
this_week
32+
.try_into()
33+
.expect("Week numbers are always less than 255")
34+
});
35+
36+
WeekNumber::new_with_year_fallback(week, year)
37+
}
38+
2439
pub(crate) fn first_day(&self) -> Option<NaiveDate> {
2540
first_day_of_week(self.number, self.year)
2641
}

0 commit comments

Comments
 (0)