Skip to content

Commit 51ecb3d

Browse files
committed
Add --week flag to 'submit'
1 parent 46a5028 commit 51ecb3d

File tree

6 files changed

+42
-15
lines changed

6 files changed

+42
-15
lines changed

src/cli/arguments.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,15 @@ pub enum Command {
120120
},
121121

122122
/// Submit time sheet for week
123-
Submit,
123+
Submit {
124+
/// Week number (defaults to current week if omitted)
125+
#[arg(long, short)]
126+
week: Option<u8>,
127+
128+
/// Year (defaults to current year if omitted)
129+
#[arg(long, short, requires = "week")]
130+
year: Option<i32>,
131+
},
124132

125133
/// Log out
126134
Logout,

src/cli/commands.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ impl<'a> CommandClient<'a> {
5959
}
6060

6161
pub(crate) async fn get(&self, week: Option<u8>, year: Option<i32>, format: Format) {
62-
let week = create_week_with_fallback(week, year);
62+
let week = to_week_with_fallback(week, year);
6363

6464
match format {
6565
Format::Json => self.get_json(week.as_ref()).await.context("JSON"),
@@ -84,7 +84,7 @@ impl<'a> CommandClient<'a> {
8484
}
8585

8686
let day = get_days(days);
87-
let week = create_week_with_fallback(week, year);
87+
let week = to_week_with_fallback(week, year);
8888

8989
self.time_sheet_service
9090
.lock()
@@ -112,7 +112,7 @@ impl<'a> CommandClient<'a> {
112112
exit_with_error!("`--day` is set but no day was provided");
113113
}
114114

115-
let week = create_week_with_fallback(week, year);
115+
let week = to_week_with_fallback(week, year);
116116
self.time_sheet_service
117117
.lock()
118118
.await
@@ -139,7 +139,7 @@ impl<'a> CommandClient<'a> {
139139
week: Option<u8>,
140140
year: Option<i32>,
141141
) {
142-
let week = create_week_with_fallback(week, year);
142+
let week = to_week_with_fallback(week, year);
143143

144144
self.repository
145145
.lock()
@@ -152,11 +152,12 @@ impl<'a> CommandClient<'a> {
152152
});
153153
}
154154

155-
pub(crate) async fn submit(&mut self) {
155+
pub(crate) async fn submit(&mut self, week: Option<u8>, year: Option<i32>) {
156+
let week = to_week_with_fallback(week, year);
156157
self.repository
157158
.lock()
158159
.await
159-
.submit()
160+
.submit(week.as_ref())
160161
.await
161162
.unwrap_or_else(|err| {
162163
exit_with_error!("Failed to submit: {}", error_stack_fmt(&err));
@@ -172,10 +173,8 @@ fn get_days(days: Option<Days>) -> Days {
172173
})
173174
}
174175

175-
fn create_week_with_fallback(week: Option<u8>, year: Option<i32>) -> Option<WeekNumber> {
176+
fn to_week_with_fallback(week: Option<u8>, year: Option<i32>) -> Option<WeekNumber> {
176177
week.map(|week| {
177-
// Fall back to today's year
178-
let year = year.unwrap_or_else(|| year.unwrap_or_else(|| chrono::Utc::now().year()));
179-
WeekNumber::new(week, year).unwrap_or_else(|err| exit_with_error!("{err}"))
178+
WeekNumber::new_with_fallback(week, year).unwrap_or_else(|err| exit_with_error!("{err}"))
180179
})
181180
}

src/cli/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ pub(crate) mod arguments;
22
pub(crate) mod commands;
33
pub(crate) mod day_parser;
44
pub(crate) mod rendering;
5+
pub(crate) mod week;

src/domain/models/week.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use anyhow::anyhow;
2-
use chrono::{NaiveDate, Weekday};
2+
use chrono::{Datelike, NaiveDate, Weekday};
33
use std::fmt::Display;
44

55
#[derive(Debug, Clone)]
@@ -15,6 +15,12 @@ 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> {
19+
// Fall back to today's year
20+
let year = year.unwrap_or_else(|| year.unwrap_or_else(|| chrono::Utc::now().year()));
21+
WeekNumber::new(week, year)
22+
}
23+
1824
pub(crate) fn first_day(&self) -> Option<NaiveDate> {
1925
first_day_of_week(self.number, self.year)
2026
}

src/infrastructure/repositories/time_sheet_repository.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@ impl TimeSheetRepository<'_> {
105105
}
106106

107107
// Fall back to today's week
108+
//
109+
// This is a small optimization since we don't need to make an extra request if we want the
110+
// current week (i.e. `week` is `None`)
108111
let time_registration = self.get_time_registration().await?;
109112
Ok(time_registration.into())
110113
}
@@ -306,8 +309,18 @@ impl TimeSheetRepository<'_> {
306309
.with_context(|| format!("Failed to get tasks for job '{job}'"))
307310
}
308311

309-
pub(crate) async fn submit(&mut self) -> Result<()> {
310-
let container_instance = self.get_container_instance().await?;
312+
pub(crate) async fn submit(&mut self, week: Option<&WeekNumber>) -> Result<()> {
313+
// Set the week
314+
let _ = self
315+
.get_time_sheet(week)
316+
.await
317+
.context("Failed to get time sheet")?;
318+
319+
let container_instance = self
320+
.get_container_instance()
321+
.await
322+
.context("Failed to get container instance")?;
323+
311324
let concurrency_control = self
312325
.client
313326
.submit(&container_instance)

src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ async fn main() -> anyhow::Result<()> {
6666
year,
6767
} => command_client.clear(&job, &task, day, week, year).await,
6868
// TODO: haven't actually tested this yet (can only be tested once a week)
69-
Command::Submit => command_client.submit().await,
69+
Command::Submit { week, year } => command_client.submit(week, year).await,
7070
Command::Logout => command_client.logout().await,
7171
Command::Line(line) => match line {
7272
Line::Delete {

0 commit comments

Comments
 (0)