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    // === KASL-SERVER MESSAGES ===
237    KaslServerReached {
238        url: String,
239        version: String,
240    },
241    KaslServerConnected {
242        user_name: String,
243        agent_name: String,
244    },
245    KaslServerConfigured(String),        // url
246    KaslServerDatabaseUnhealthy(String), // what the server reported
247    KaslServerUnreachable(String),       // error message
248    KaslServerTokenRejected(String),     // error message
249    KaslServerUrlNeedsScheme(String),    // the url as entered
250    KaslServerTokenEmpty,
251    KaslServerTokenMissing,
252    KaslServerTokenNotRemoved(String), // error message
253    KaslServerNotConnected,
254    KaslServerDisconnected,
255    KaslServerNoDayToPush(String), // the date, as the user would read it
256    KaslServerDayPushed {
257        date: String,
258        pauses: usize,
259        tasks: usize,
260    },
261    KaslServerTasksDeleted(u64),         // how many the server dropped as no longer held here
262    KaslServerPushRejected(String),      // error message
263    KaslServerPushTokenRejected(String), // error message
264    KaslServerPushRetryable(String),     // error message
265    KaslServerDayQueued(String),         // the date now waiting in the outbox
266    KaslServerQueueEmpty,
267    KaslServerQueueOwed(i64), // how many days are waiting
268    KaslServerQueueEntry {
269        date: String,
270        attempts: i32,
271        last_error: Option<String>,
272    },
273    KaslServerQueueSending(usize), // how many days are about to go
274    KaslServerDayRefused {
275        date: String,
276        reason: String,
277    },
278    KaslServerDayDeferred {
279        date: String,
280        reason: String,
281    },
282    KaslServerFlushSummary {
283        accepted: usize,
284        refused: usize,
285        deferred: usize,
286    },
287    KaslServerBackfillRange {
288        from: String,
289        to: String,
290        days: usize,
291    },
292    KaslServerBackfillNoDays {
293        from: String,
294        to: String,
295    },
296    KaslServerBackfillOrderReversed, // --from is later than --to
297
298    // === DATABASE MESSAGES ===
299    DatabaseOperationFailed {
300        operation: String,
301        error: String,
302    },
303    NoIdSet,
304
305    // === FILE SYSTEM MESSAGES ===
306    FileNotFound,
307    InvalidPidFileContent,
308
309    // === SYSTEM/PATH MESSAGES ===
310    PathConfigured,
311    PathConfigWarning {
312        error: String,
313    },
314    PathRegistryQueryError {
315        status: String,
316    },
317    PathRegistryUpdateError {
318        status: String,
319        stderr: String,
320    },
321    FailedToJoinPaths,
322    FailedToExecuteRegQuery,
323    FailedToParseRegOutput,
324    FailedToGetPathFromReg,
325    FailedToExecuteRegSet,
326    FailedToOpenProcess(u32),      // error code
327    FailedToTerminateProcess(u32), // error code
328    ProcessTerminationNotSupported,
329
330    // === PRODUCTIVITY MESSAGES ===
331    MonthlyProductivity(f64), // percentage
332    LowProductivityWarning {
333        current: f64,
334        threshold: f64,
335    },
336    ProductivityTooLowToSend {
337        current: f64,
338        threshold: f64,
339    },
340    ManualPauseCreated {
341        start_time: String,
342        end_time: String,
343        duration_minutes: u64,
344    },
345    ManualPauseOverlaps {
346        start_time: String,
347        end_time: String,
348    },
349    ManualPauseRemoved(i32),
350    ManualPauseNotFound(i32),
351
352    // === ENCRYPTION/SECRET MESSAGES ===
353
354    // === PROMPTS ===
355    PromptTaskName,
356    TaskNameMergedFromPaste,
357    PromptTaskComment,
358    PromptTaskCompleteness,
359    PromptMinPauseDuration,
360    PromptPauseThreshold,
361    PromptPollInterval,
362    PromptActivityThreshold,
363    PromptMinProductivityThreshold,
364    PromptWorkdayHours,
365    PromptMinWorkdayFraction,
366    PromptServerApiUrl,
367    PromptServerAuthToken,
368    PromptKaslServerUrl,
369    PromptKaslServerToken,
370    PromptSelectModules,
371    PromptSelectTasksToImport,
372    PromptSelectTasksToIgnore,
373    PromptSelectIgnoreNamesToRemove,
374    PromptAddIgnoreName,
375
376    // === GENERAL MESSAGES ===
377    OperationCompleted,
378    OperationCancelled,
379    InvalidInput,
380    PermissionDenied,
381    DeprecatedCommand(&'static str, &'static str), // old name, new name
382
383    // === ERROR LOGGING ===
384    ErrorSendingEvents(String),        // error message
385    ErrorSendingMonthlyReport(String), // error message
386    ErrorInRdevListener(String),       // error message
387    ErrorRequestingRestDates(String),  // error message
388
389    // === SPECIFIC UI MESSAGES ===
390    SelectingTask(String), // task name
391
392    // === JIRA INBOX MESSAGES ===
393    JiraInboxRequiresJiraConfig,
394    JiraInboxEmpty,
395    JiraInboxListHeader,
396    JiraInboxSynced {
397        fetched: usize,
398        new_count: usize,
399        changed: usize,
400        gone: usize,
401    },
402    JiraInboxNewIssues(usize),
403    JiraInboxNotFound(String),
404    JiraInboxPinned(String),
405    JiraInboxUnpinned(String),
406    JiraInboxDismissed(String),
407    JiraInboxOpened(String),
408    JiraInboxTaken(String),
409
410    /// The issue already became a task: key, then the task's name.
411    JiraInboxAlreadyTaken(String, String),
412
413    /// What the inbox holds, shown under the daily report.
414    JiraInboxSummary {
415        total: i64,
416        fresh: i64,
417        taken: i64,
418    },
419    JiraInboxOpenFailed(String),
420    PromptJiraInboxEnabled,
421    PromptJiraInboxPollInterval,
422    PromptJiraInboxNotify,
423    PromptJiraInboxSortFieldId,
424    PromptJiraInboxSortFieldLabel,
425    PromptJiraInboxExtraFieldId,
426    PromptJiraInboxExtraFieldLabel,
427
428    // === MIGRATION MESSAGES ===
429    MigrationsFound(usize),        // count
430    RunningMigration(u32, String), // version, name
431    MigrationCompleted(u32),       // version
432    MigrationFailed(u32, String),  // version, error
433    AllMigrationsCompleted,
434    DatabaseVersion(u32),
435    DatabaseUpToDate,
436    DatabaseNeedsUpdate,
437    MigrationHistory,
438    NothingToRollback,
439    RollingBack(u32, u32),  // from, to
440    RollbackCompleted(u32), // version
441}