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
266    // === DATABASE MESSAGES ===
267    DatabaseOperationFailed {
268        operation: String,
269        error: String,
270    },
271    NoIdSet,
272
273    // === FILE SYSTEM MESSAGES ===
274    FileNotFound,
275    InvalidPidFileContent,
276
277    // === SYSTEM/PATH MESSAGES ===
278    PathConfigured,
279    PathConfigWarning {
280        error: String,
281    },
282    PathRegistryQueryError {
283        status: String,
284    },
285    PathRegistryUpdateError {
286        status: String,
287        stderr: String,
288    },
289    FailedToJoinPaths,
290    FailedToExecuteRegQuery,
291    FailedToParseRegOutput,
292    FailedToGetPathFromReg,
293    FailedToExecuteRegSet,
294    FailedToOpenProcess(u32),      // error code
295    FailedToTerminateProcess(u32), // error code
296    ProcessTerminationNotSupported,
297
298    // === PRODUCTIVITY MESSAGES ===
299    MonthlyProductivity(f64), // percentage
300    LowProductivityWarning {
301        current: f64,
302        threshold: f64,
303    },
304    ProductivityTooLowToSend {
305        current: f64,
306        threshold: f64,
307    },
308    ManualPauseCreated {
309        start_time: String,
310        end_time: String,
311        duration_minutes: u64,
312    },
313    ManualPauseOverlaps {
314        start_time: String,
315        end_time: String,
316    },
317    ManualPauseRemoved(i32),
318    ManualPauseNotFound(i32),
319
320    // === ENCRYPTION/SECRET MESSAGES ===
321
322    // === PROMPTS ===
323    PromptTaskName,
324    TaskNameMergedFromPaste,
325    PromptTaskComment,
326    PromptTaskCompleteness,
327    PromptMinPauseDuration,
328    PromptPauseThreshold,
329    PromptPollInterval,
330    PromptActivityThreshold,
331    PromptMinProductivityThreshold,
332    PromptWorkdayHours,
333    PromptMinWorkdayFraction,
334    PromptServerApiUrl,
335    PromptServerAuthToken,
336    PromptKaslServerUrl,
337    PromptKaslServerToken,
338    PromptSelectModules,
339    PromptSelectTasksToImport,
340    PromptSelectTasksToIgnore,
341    PromptSelectIgnoreNamesToRemove,
342    PromptAddIgnoreName,
343
344    // === GENERAL MESSAGES ===
345    OperationCompleted,
346    OperationCancelled,
347    InvalidInput,
348    PermissionDenied,
349    DeprecatedCommand(&'static str, &'static str), // old name, new name
350
351    // === ERROR LOGGING ===
352    ErrorSendingEvents(String),        // error message
353    ErrorSendingMonthlyReport(String), // error message
354    ErrorInRdevListener(String),       // error message
355    ErrorRequestingRestDates(String),  // error message
356
357    // === SPECIFIC UI MESSAGES ===
358    SelectingTask(String), // task name
359
360    // === JIRA INBOX MESSAGES ===
361    JiraInboxRequiresJiraConfig,
362    JiraInboxEmpty,
363    JiraInboxListHeader,
364    JiraInboxSynced {
365        fetched: usize,
366        new_count: usize,
367        changed: usize,
368        gone: usize,
369    },
370    JiraInboxNewIssues(usize),
371    JiraInboxNotFound(String),
372    JiraInboxPinned(String),
373    JiraInboxUnpinned(String),
374    JiraInboxDismissed(String),
375    JiraInboxOpened(String),
376    JiraInboxTaken(String),
377
378    /// The issue already became a task: key, then the task's name.
379    JiraInboxAlreadyTaken(String, String),
380
381    /// What the inbox holds, shown under the daily report.
382    JiraInboxSummary {
383        total: i64,
384        fresh: i64,
385        taken: i64,
386    },
387    JiraInboxOpenFailed(String),
388    PromptJiraInboxEnabled,
389    PromptJiraInboxPollInterval,
390    PromptJiraInboxNotify,
391    PromptJiraInboxSortFieldId,
392    PromptJiraInboxSortFieldLabel,
393    PromptJiraInboxExtraFieldId,
394    PromptJiraInboxExtraFieldLabel,
395
396    // === MIGRATION MESSAGES ===
397    MigrationsFound(usize),        // count
398    RunningMigration(u32, String), // version, name
399    MigrationCompleted(u32),       // version
400    MigrationFailed(u32, String),  // version, error
401    AllMigrationsCompleted,
402    DatabaseVersion(u32),
403    DatabaseUpToDate,
404    DatabaseNeedsUpdate,
405    MigrationHistory,
406    NothingToRollback,
407    RollingBack(u32, u32),  // from, to
408    RollbackCompleted(u32), // version
409}