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