Skip to content

Commit 07f9346

Browse files
committed
refactoring storage
Signed-off-by: simonsan <[email protected]>
1 parent ce04c9a commit 07f9346

File tree

21 files changed

+594
-472
lines changed

21 files changed

+594
-472
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/core/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ clap = { workspace = true, optional = true, features = ["env", "wrap_help", "der
3131
directories = { workspace = true }
3232
displaydoc = { workspace = true }
3333
dotenvy = { workspace = true }
34+
eyre = { workspace = true }
3435
getset = { workspace = true }
3536
itertools = { workspace = true }
3637
merge = { workspace = true }

crates/core/src/commands/adjust.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::{
1313
commands::UpdateOptions,
1414
config::PaceConfig,
1515
error::{ActivityLogErrorKind, PaceResult, UserMessage},
16-
prelude::ActivityStorage,
16+
prelude::{ActivityStorage, PaceErrorKind},
1717
service::activity_store::ActivityStore,
1818
storage::{ActivityQuerying, ActivityWriteOps, SyncStorage},
1919
};
@@ -165,10 +165,12 @@ impl AdjustCommandOptions {
165165

166166
debug!("Parsed time: {date_time:?}");
167167

168-
let activity_store = ActivityStore::with_storage(storage)?;
168+
let activity_store =
169+
ActivityStore::with_storage(storage).map_err(PaceErrorKind::Storage)?;
169170

170171
let activity_item = activity_store
171-
.most_recent_active_activity()?
172+
.most_recent_active_activity()
173+
.map_err(PaceErrorKind::Storage)?
172174
.ok_or_else(|| ActivityLogErrorKind::NoActiveActivityToAdjust)?;
173175

174176
debug!("Most recent active activity item: {:?}", activity_item);
@@ -212,10 +214,12 @@ impl AdjustCommandOptions {
212214
}
213215
}
214216

215-
_ = activity_store.update_activity(guid, activity.clone(), UpdateOptions::default())?;
217+
_ = activity_store
218+
.update_activity(guid, activity.clone(), UpdateOptions::default())
219+
.map_err(PaceErrorKind::Storage)?;
216220

217221
if activity_item.activity() != &activity {
218-
activity_store.sync()?;
222+
activity_store.sync().map_err(PaceErrorKind::Storage)?;
219223
return Ok(UserMessage::new(format!(
220224
"{} has been adjusted.",
221225
activity_item.activity()

crates/core/src/commands/begin.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::{
1212
config::PaceConfig,
1313
domain::activity::{Activity, ActivityKind},
1414
error::{PaceResult, UserMessage},
15-
prelude::ActivityStorage,
15+
prelude::{ActivityStorage, PaceErrorKind},
1616
service::activity_store::ActivityStore,
1717
storage::{ActivityStateManagement, SyncStorage},
1818
};
@@ -144,13 +144,16 @@ impl BeginCommandOptions {
144144
.tags(tags)
145145
.build();
146146

147-
let activity_store = ActivityStore::with_storage(storage)?;
147+
let activity_store =
148+
ActivityStore::with_storage(storage).map_err(PaceErrorKind::Storage)?;
148149

149-
let activity_item = activity_store.begin_activity(activity)?;
150+
let activity_item = activity_store
151+
.begin_activity(activity)
152+
.map_err(PaceErrorKind::Storage)?;
150153

151154
debug!("Started Activity: {:?}", activity_item);
152155

153-
activity_store.sync()?;
156+
activity_store.sync().map_err(PaceErrorKind::Storage)?;
154157

155158
Ok(UserMessage::new(format!("{}", activity_item.activity())))
156159
}

crates/core/src/commands/end.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::{
1313
commands::EndOptions,
1414
config::PaceConfig,
1515
error::{PaceResult, UserMessage},
16-
prelude::ActivityStorage,
16+
prelude::{ActivityStorage, PaceErrorKind},
1717
service::activity_store::ActivityStore,
1818
storage::{ActivityStateManagement, SyncStorage},
1919
};
@@ -98,11 +98,15 @@ impl EndCommandOptions {
9898

9999
debug!("Parsed date time: {:?}", date_time);
100100

101-
let activity_store = ActivityStore::with_storage(storage)?;
101+
let activity_store =
102+
ActivityStore::with_storage(storage).map_err(PaceErrorKind::Storage)?;
102103

103104
let end_opts = EndOptions::builder().end_time(date_time).build();
104105

105-
let user_message = (activity_store.end_all_activities(end_opts)?).map_or_else(
106+
let user_message = (activity_store
107+
.end_all_activities(end_opts)
108+
.map_err(PaceErrorKind::Storage)?)
109+
.map_or_else(
106110
|| "No unfinished activities to end.".to_string(),
107111
|unfinished_activities| {
108112
let mut msgs = vec![];
@@ -116,7 +120,7 @@ impl EndCommandOptions {
116120
},
117121
);
118122

119-
activity_store.sync()?;
123+
activity_store.sync().map_err(PaceErrorKind::Storage)?;
120124

121125
Ok(UserMessage::new(user_message))
122126
}

crates/core/src/commands/hold.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::{
1414
config::PaceConfig,
1515
domain::intermission::IntermissionAction,
1616
error::{PaceResult, UserMessage},
17-
prelude::ActivityStorage,
17+
prelude::{ActivityStorage, PaceErrorKind},
1818
service::activity_store::ActivityStore,
1919
storage::{ActivityStateManagement, SyncStorage},
2020
};
@@ -119,18 +119,21 @@ impl HoldCommandOptions {
119119

120120
debug!("Hold options: {hold_opts:?}");
121121

122-
let activity_store = ActivityStore::with_storage(storage)?;
122+
let activity_store =
123+
ActivityStore::with_storage(storage).map_err(PaceErrorKind::Storage)?;
123124

124-
let user_message =
125-
if let Some(activity) = activity_store.hold_most_recent_active_activity(hold_opts)? {
126-
debug!("Held {}", activity.activity());
125+
let user_message = if let Some(activity) = activity_store
126+
.hold_most_recent_active_activity(hold_opts)
127+
.map_err(PaceErrorKind::Storage)?
128+
{
129+
debug!("Held {}", activity.activity());
127130

128-
activity_store.sync()?;
131+
activity_store.sync().map_err(PaceErrorKind::Storage)?;
129132

130-
format!("Held {}", activity.activity())
131-
} else {
132-
"No unfinished activities to hold.".to_string()
133-
};
133+
format!("Held {}", activity.activity())
134+
} else {
135+
"No unfinished activities to hold.".to_string()
136+
};
134137

135138
Ok(UserMessage::new(user_message))
136139
}

crates/core/src/commands/now.rs

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::{
88
config::PaceConfig,
99
domain::{activity::ActivityItem, filter::ActivityFilterKind},
1010
error::{PaceResult, UserMessage},
11-
prelude::ActivityStorage,
11+
prelude::{ActivityStorage, PaceErrorKind},
1212
service::activity_store::ActivityStore,
1313
storage::{ActivityQuerying, ActivityReadOps},
1414
};
@@ -38,28 +38,31 @@ impl NowCommandOptions {
3838
config: &PaceConfig,
3939
storage: Arc<dyn ActivityStorage>,
4040
) -> PaceResult<UserMessage> {
41-
let activity_store = ActivityStore::with_storage(storage)?;
41+
let activity_store =
42+
ActivityStore::with_storage(storage).map_err(PaceErrorKind::Storage)?;
4243

43-
let user_message = (activity_store.list_current_activities(ActivityFilterKind::Active)?)
44-
.map_or_else(
45-
|| "No activities are currently running.".to_string(),
46-
|activities| {
47-
debug!("Current Activities: {:?}", activities);
44+
let user_message = (activity_store
45+
.list_current_activities(ActivityFilterKind::Active)
46+
.map_err(PaceErrorKind::Storage)?)
47+
.map_or_else(
48+
|| "No activities are currently running.".to_string(),
49+
|activities| {
50+
debug!("Current Activities: {:?}", activities);
4851

49-
// Get the activity items
50-
let activity_items = activities
51-
.iter()
52-
.flat_map(|activity_id| activity_store.read_activity(*activity_id))
53-
.collect::<Vec<ActivityItem>>();
52+
// Get the activity items
53+
let activity_items = activities
54+
.iter()
55+
.flat_map(|activity_id| activity_store.read_activity(*activity_id))
56+
.collect::<Vec<ActivityItem>>();
5457

55-
let mut msgs = vec![];
56-
for activity in &activity_items {
57-
msgs.push(format!("{}", activity.activity()));
58-
}
58+
let mut msgs = vec![];
59+
for activity in &activity_items {
60+
msgs.push(format!("{}", activity.activity()));
61+
}
5962

60-
msgs.join("\n")
61-
},
62-
);
63+
msgs.join("\n")
64+
},
65+
);
6366

6467
Ok(UserMessage::new(user_message))
6568
}

crates/core/src/commands/reflect.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::{
1515
config::PaceConfig,
1616
domain::{activity::ActivityKind, filter::FilterOptions, reflection::ReflectionsFormatKind},
1717
error::{PaceResult, TemplatingErrorKind, UserMessage},
18-
prelude::ActivityStorage,
18+
prelude::{ActivityStorage, PaceErrorKind},
1919
service::{activity_store::ActivityStore, activity_tracker::ActivityTracker},
2020
template::{PaceReflectionTemplate, TEMPLATES},
2121
};
@@ -147,14 +147,16 @@ impl ReflectCommandOptions {
147147
PaceTimeZoneKind::NotSet,
148148
))?;
149149

150-
let activity_store = ActivityStore::with_storage(storage)?;
150+
let activity_store =
151+
ActivityStore::with_storage(storage).map_err(PaceErrorKind::Storage)?;
151152

152153
let activity_tracker = ActivityTracker::with_activity_store(activity_store);
153154

154155
debug!("Displaying reflection for time frame: {}", time_frame);
155156

156-
let Some(reflection) =
157-
activity_tracker.generate_reflection(FilterOptions::from(self), time_frame)?
157+
let Some(reflection) = activity_tracker
158+
.generate_reflection(FilterOptions::from(self), time_frame)
159+
.map_err(PaceErrorKind::Storage)?
158160
else {
159161
return Ok(UserMessage::new(
160162
"No activities found for the specified time frame",

crates/core/src/config.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,6 @@ pub enum ActivityLogStorageKind {
148148
#[default]
149149
File,
150150
Database,
151-
#[cfg(test)]
152151
InMemory,
153152
}
154153

crates/core/src/error.rs

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
//! Error types and Result module.
22
33
use displaydoc::Display;
4+
use eyre::Result as EyreResult;
45
use miette::Diagnostic;
56
use pace_time::error::PaceTimeErrorKind;
67
use std::{error::Error, io, path::PathBuf};
78
use thiserror::Error;
89

910
use crate::domain::activity::{Activity, ActivityGuid};
1011

12+
macro_rules! impl_pace_error_marker {
13+
($error:ty) => {
14+
impl PaceErrorMarker for $error {}
15+
};
16+
}
17+
1118
/// Result type that is being returned from test functions and methods that can fail and thus have errors.
1219
pub type TestResult<T> = Result<T, Box<dyn Error + 'static>>;
1320

@@ -17,6 +24,9 @@ pub type PaceResult<T> = Result<T, PaceError>;
1724
/// Result type that is being returned from methods that have optional return values and can fail thus having [`PaceError`]s.
1825
pub type PaceOptResult<T> = PaceResult<Option<T>>;
1926

27+
pub type PaceStorageResult<T> = EyreResult<T>;
28+
pub type PaceStorageOptResult<T> = EyreResult<Option<T>>;
29+
2030
/// User message type that is being returned from methods that need to print a message to the user.
2131
#[derive(Debug, Clone, PartialEq, Eq)]
2232
pub struct UserMessage {
@@ -102,9 +112,6 @@ impl PaceError {
102112
#[non_exhaustive]
103113
#[derive(Error, Debug, Display)]
104114
pub enum PaceErrorKind {
105-
// /// [`CommandErrorKind`] describes the errors that can happen while executing a high-level command
106-
// #[error(transparent)]
107-
// Command(#[from] CommandErrorKind),
108115
/// [`std::io::Error`]
109116
#[error(transparent)]
110117
StdIo(#[from] std::io::Error),
@@ -153,15 +160,16 @@ pub enum PaceErrorKind {
153160
/// Configuration file not found, please run `pace setup config` to initialize `pace`
154161
ParentDirNotFound(PathBuf),
155162

156-
/// Database storage not implemented, yet!
157-
DatabaseStorageNotImplemented,
158-
159163
/// There is no path available to store the activity log
160164
NoPathAvailable,
161165

162166
/// Templating error: {0}
163167
#[error(transparent)]
164168
Template(#[from] TemplatingErrorKind),
169+
170+
/// Storage error: {0}
171+
#[error(transparent)]
172+
Storage(#[from] eyre::Report),
165173
}
166174

167175
/// [`ActivityLogErrorKind`] describes the errors that can happen while dealing with the activity log.
@@ -297,20 +305,23 @@ pub enum ActivityStoreErrorKind {
297305

298306
/// Missing category for activity: {0}
299307
MissingCategoryForActivity(ActivityGuid),
308+
309+
/// Creating ActivityStore from storage failed
310+
CreatingFromStorageFailed,
300311
}
301312

302313
trait PaceErrorMarker: Error {}
303314

304-
impl PaceErrorMarker for std::io::Error {}
305-
impl PaceErrorMarker for toml::de::Error {}
306-
impl PaceErrorMarker for toml::ser::Error {}
307-
impl PaceErrorMarker for serde_json::Error {}
308-
impl PaceErrorMarker for chrono::ParseError {}
309-
impl PaceErrorMarker for chrono::OutOfRangeError {}
310-
impl PaceErrorMarker for ActivityLogErrorKind {}
311-
impl PaceErrorMarker for PaceTimeErrorKind {}
312-
impl PaceErrorMarker for ActivityStoreErrorKind {}
313-
impl PaceErrorMarker for TemplatingErrorKind {}
315+
impl_pace_error_marker!(std::io::Error);
316+
impl_pace_error_marker!(toml::de::Error);
317+
impl_pace_error_marker!(toml::ser::Error);
318+
impl_pace_error_marker!(serde_json::Error);
319+
impl_pace_error_marker!(chrono::ParseError);
320+
impl_pace_error_marker!(chrono::OutOfRangeError);
321+
impl_pace_error_marker!(ActivityLogErrorKind);
322+
impl_pace_error_marker!(PaceTimeErrorKind);
323+
impl_pace_error_marker!(ActivityStoreErrorKind);
324+
impl_pace_error_marker!(TemplatingErrorKind);
314325

315326
impl<E> From<E> for PaceError
316327
where

0 commit comments

Comments
 (0)