Skip to main content

kasl/libs/messages/
types.rs

1//! Message type definitions for the kasl application.
2//!
3//! Defines the central `Message` enum that represents all user-facing messages with type safety and compile-time verification.
4//!
5//! ## Usage
6//!
7//! ```rust
8//! use kasl::libs::messages::types::Message;
9//! use kasl::{msg_info, msg_error, msg_success};
10//!
11//! msg_success!(Message::TaskCreated);
12//! msg_error!(Message::ConfigSaveError);
13//! msg_info!(Message::MonitorStarted {
14//!     pause_threshold: 60,
15//!     poll_interval: 500,
16//!     activity_threshold: 30,
17//! });
18//! ```
19
20/// Comprehensive message enumeration for all user-facing communication.
21#[derive(Debug, Clone)]
22pub enum Message {
23    // === AUTOSTART MESSAGES ===
24    AutostartEnabled,
25    AutostartEnabledUser,
26    AutostartDisabled,
27    AutostartAlreadyDisabled,
28    AutostartEnableFailed(String),
29    AutostartDisableFailed(String),
30    AutostartStatus(String),
31    AutostartRequiresAdmin,
32    AutostartCheckingAlternative,
33
34    // === TASK MESSAGES ===
35    TaskCreated,
36    TaskUpdated,
37    TaskNotFound,
38    TaskUpdateFailed,
39    TasksDeletedCount(usize),
40    TasksNotFoundForDate(String),
41    TasksNotFoundSad,
42    TasksHeader,
43    /// Summary line before unified discovery MultiSelect
44    TasksDiscoverySummary {
45        incomplete: usize,
46        jira: usize,
47        gitlab: usize,
48    },
49    /// Non-selectable separator between incomplete and other items
50    TasksDiscoverySeparator,
51    TasksDiscoverySearchingIncomplete,
52    TasksDiscoveryFetchingExternal,
53    NoTaskIdsProvided,
54    TasksNotFoundForIds(Vec<i32>),
55    TasksToBeDeleted,
56    ConfirmDeleteTask,
57    ConfirmDeleteTasks(usize),
58    ConfirmDeleteAllTodayTasks(usize),
59    ConfirmDeleteAllTodayTasksFinal,
60    NoTasksForToday,
61    TaskNotFoundWithId(i32),
62    CurrentTaskState,
63    TaskEditPreview,
64    ConfirmTaskUpdate,
65    NoChangesDetected,
66    NoTasksSelected,
67    SelectTasksToEdit,
68    EditingTask(String),
69    TaskUpdatedWithName(String),
70    TaskSkippedNoChanges(String),
71    TaskEditingCompleted,
72    PromptTaskNameEdit,
73    PromptTaskCommentEdit,
74    PromptTaskCompletenessEdit,
75    TaskCompletenessRange,
76
77    // === WORKDAY MESSAGES ===
78    WorkdayEnded,
79    WorkdayNotFoundForDate(String),
80    WorkdayCreateFailed,
81    WorkdayStarting(String),                    // date
82    WorkdayCouldNotFindAfterFinalizing(String), // date
83
84    // === CONFIGURATION MESSAGES ===
85    ConfigSaved,
86    ConfigDeleted,
87    ConfigParseError,
88    ConfigSaveError,
89    ConfigModuleGitLab,
90    ConfigModuleJira,
91    ConfigModuleSiServer,
92    ConfigModuleMonitor,
93    ConfigModuleServer,
94    ConfigModuleProductivity,
95    ConfigModuleTaskDiscovery,
96    ConfigModuleJiraInbox,
97    TaskDiscoveryIgnoreListHeader,
98    TaskDiscoveryIgnoreListEmpty,
99    TaskDiscoveryIgnoreNameAdded(String),
100    TaskDiscoveryIgnoreNameExists(String),
101    TaskDiscoveryIgnoreNamesAdded(usize),
102
103    // === REPORT MESSAGES ===
104    DailyReportSent(String),   // date
105    MonthlyReportSent(String), // date
106    MonthlyReportTriggered,
107    ReportSendFailed(String),        // status
108    MonthlyReportSendFailed(String), // status
109    ReportHeader(String),            // date
110    WorkingHoursForMonth(String),    // month/year
111
112    // === EXPORT MESSAGES ===
113    ExportingData(String, String), // data type, format
114    ExportCompleted(String),       // file path
115    ExportingAllData,
116
117    // === TEMPLATE MESSAGES ===
118    TemplateCreated(String),
119    TemplateUpdated(String),
120    TemplateDeleted(String),
121    TemplateNotFound(String),
122    TemplateAlreadyExists(String),
123    TemplateCreateFailed,
124    NoTemplatesFound,
125    TemplateListHeader,
126    SelectTemplateToEdit,
127    SelectTemplateToDelete,
128    ConfirmDeleteTemplate(String),
129    EditingTemplate(String),
130    NoTemplatesMatchingQuery(String),
131    TemplateSearchResults(String),
132    SelectTemplateAction,
133    PromptTemplateName,
134    PromptTemplateTaskName,
135    PromptTemplateComment,
136    PromptTemplateCompleteness,
137    CreatingTaskFromTemplate(String),
138    SelectTemplate,
139    CreateTemplateFirst,
140
141    // === TAG MESSAGES ===
142    TagCreated(String),
143    TagUpdated(String),
144    TagDeleted(String),
145    TagNotFound(String),
146    TagAlreadyExists(String),
147    NoTagsFound,
148    TagListHeader,
149    EditingTag(String),
150    SelectTagAction,
151    SelectTagToEdit,
152    SelectTagToDelete,
153    ConfirmDeleteTag(String),
154    ConfirmDeleteTagWithTasks(String, usize), // tag name, task count
155    PromptTagName,
156    PromptTagColor,
157    NoTasksWithTag(String),
158    TasksWithTag(String),
159    TagsAddedToTask(String),
160
161    // === SHORT INTERVALS MESSAGES ===
162    ShortIntervalsDetected(usize, String), // count, total duration
163    PromptMinWorkInterval,
164
165    // === TIME ADJUSTMENT MESSAGES ===
166    WorkdayUpdateFailed,
167
168    // === PAUSE MESSAGES ===
169    PausesTitle(String),
170
171    // === MONITOR MESSAGES ===
172    MonitorStarted {
173        pause_threshold: u64,
174        poll_interval: u64,
175        activity_threshold: u64,
176    },
177    MonitorExitedNormally,
178    MonitorShuttingDown,
179    MonitorError(String),
180    MonitorTaskPanicked(String),
181    PauseStarted,
182    PauseEnded,
183
184    // === WATCHER/DAEMON MESSAGES ===
185    WatcherStarted(u32), // PID
186    WatcherStopped(u32), // PID
187    WatcherNotRunning,
188    WatcherNotRunningPidNotFound,
189    WatcherStartingForeground,
190    WatcherStoppingExisting(String),     // PID
191    WatcherFailedToStopExisting(String), // error
192    WatcherReceivedSigterm,
193    WatcherReceivedSigint,
194    WatcherReceivedCtrlC,
195    WatcherCtrlCListenFailed(String), // error
196    WatcherSignalHandlingNotSupported,
197    DaemonModeNotSupported,
198    FailedToGetCurrentExecutable,
199    FailedToCreateSigtermHandler,
200    FailedToCreateSigintHandler,
201
202    // === UPDATE MESSAGES ===
203    UpdateAvailable {
204        app_name: String,
205        latest: String,
206    },
207    UpdateCompleted {
208        app_name: String,
209        version: String,
210    },
211    NoUpdateRequired,
212    UpdateDownloadUrlNotSet,
213    UpdateLatestTagNotFound(String),
214    WatcherStoppingForUpdate,
215    WatcherRestartingAfterUpdate,
216    WatcherStoppingForConfig,
217    WatcherRestartingAfterConfig,
218    WatcherRestarted,
219    WatcherRestartFailed {
220        error: String,
221    },
222    UpdateBinaryNotFoundInArchive,
223
224    // === AUTHENTICATION MESSAGES ===
225    WrongPassword(i32), // attempt count
226
227    // === API MESSAGES ===
228    GitlabFetchFailed(String),  // error message
229    GitlabUserIdFailed(String), // error message
230    JiraFetchFailed(String),    // error message
231    SiServerConfigNotFound,
232    SiServerSessionFailed(String),          // error message
233    SiServerRestDatesFailed(String),        // error message
234    SiServerRestDatesParsingFailed(String), // error message
235
236    // === DATABASE MESSAGES ===
237    DatabaseOperationFailed {
238        operation: String,
239        error: String,
240    },
241    NoIdSet,
242
243    // === FILE SYSTEM MESSAGES ===
244    FileNotFound,
245    InvalidPidFileContent,
246
247    // === SYSTEM/PATH MESSAGES ===
248    PathConfigured,
249    PathConfigWarning {
250        error: String,
251    },
252    PathRegistryQueryError {
253        status: String,
254    },
255    PathRegistryUpdateError {
256        status: String,
257        stderr: String,
258    },
259    FailedToJoinPaths,
260    FailedToExecuteRegQuery,
261    FailedToParseRegOutput,
262    FailedToGetPathFromReg,
263    FailedToExecuteRegSet,
264    FailedToOpenProcess(u32),      // error code
265    FailedToTerminateProcess(u32), // error code
266    ProcessTerminationNotSupported,
267
268    // === PRODUCTIVITY MESSAGES ===
269    MonthlyProductivity(f64), // percentage
270    LowProductivityWarning {
271        current: f64,
272        threshold: f64,
273    },
274    ProductivityTooLowToSend {
275        current: f64,
276        threshold: f64,
277    },
278    ManualPauseCreated {
279        start_time: String,
280        end_time: String,
281        duration_minutes: u64,
282    },
283    ManualPauseOverlaps {
284        start_time: String,
285        end_time: String,
286    },
287    ManualPauseRemoved(i32),
288    ManualPauseNotFound(i32),
289
290    // === ENCRYPTION/SECRET MESSAGES ===
291
292    // === PROMPTS ===
293    PromptTaskName,
294    TaskNameMergedFromPaste,
295    PromptTaskComment,
296    PromptTaskCompleteness,
297    PromptMinPauseDuration,
298    PromptPauseThreshold,
299    PromptPollInterval,
300    PromptActivityThreshold,
301    PromptMinProductivityThreshold,
302    PromptWorkdayHours,
303    PromptMinWorkdayFraction,
304    PromptServerApiUrl,
305    PromptServerAuthToken,
306    PromptSelectModules,
307    PromptSelectTasksToImport,
308    PromptSelectTasksToIgnore,
309    PromptSelectIgnoreNamesToRemove,
310    PromptAddIgnoreName,
311
312    // === GENERAL MESSAGES ===
313    OperationCompleted,
314    OperationCancelled,
315    InvalidInput,
316    PermissionDenied,
317    DeprecatedCommand(&'static str, &'static str), // old name, new name
318
319    // === ERROR LOGGING ===
320    ErrorSendingEvents(String),        // error message
321    ErrorSendingMonthlyReport(String), // error message
322    ErrorInRdevListener(String),       // error message
323    ErrorRequestingRestDates(String),  // error message
324
325    // === SPECIFIC UI MESSAGES ===
326    SelectingTask(String), // task name
327
328    // === JIRA INBOX MESSAGES ===
329    JiraInboxRequiresJiraConfig,
330    JiraInboxEmpty,
331    JiraInboxListHeader,
332    JiraInboxSynced {
333        fetched: usize,
334        new_count: usize,
335        changed: usize,
336        gone: usize,
337    },
338    JiraInboxNewIssues(usize),
339    JiraInboxNotFound(String),
340    JiraInboxPinned(String),
341    JiraInboxUnpinned(String),
342    JiraInboxDismissed(String),
343    JiraInboxOpened(String),
344    JiraInboxTaken(String),
345
346    /// The issue already became a task: key, then the task's name.
347    JiraInboxAlreadyTaken(String, String),
348
349    /// What the inbox holds, shown under the daily report.
350    JiraInboxSummary {
351        total: i64,
352        fresh: i64,
353        taken: i64,
354    },
355    JiraInboxOpenFailed(String),
356    PromptJiraInboxEnabled,
357    PromptJiraInboxPollInterval,
358    PromptJiraInboxNotify,
359    PromptJiraInboxSortFieldId,
360    PromptJiraInboxSortFieldLabel,
361    PromptJiraInboxExtraFieldId,
362    PromptJiraInboxExtraFieldLabel,
363
364    // === MIGRATION MESSAGES ===
365    MigrationsFound(usize),        // count
366    RunningMigration(u32, String), // version, name
367    MigrationCompleted(u32),       // version
368    MigrationFailed(u32, String),  // version, error
369    AllMigrationsCompleted,
370    DatabaseVersion(u32),
371    DatabaseUpToDate,
372    DatabaseNeedsUpdate,
373    MigrationHistory,
374    NothingToRollback,
375    RollingBack(u32, u32),  // from, to
376    RollbackCompleted(u32), // version
377}