Skip to main content

mxr_config/
types.rs

1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3use std::path::PathBuf;
4
5#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
6#[serde(rename_all = "snake_case")]
7pub enum GmailCredentialSource {
8    #[default]
9    Bundled,
10    Custom,
11}
12
13/// Top-level mxr configuration.
14#[derive(Debug, Clone, Default, Serialize, Deserialize)]
15#[serde(default)]
16pub struct MxrConfig {
17    pub general: GeneralConfig,
18    pub accounts: HashMap<String, AccountConfig>,
19    pub render: RenderConfig,
20    pub search: SearchConfig,
21    pub snooze: SnoozeConfig,
22    pub logging: LoggingConfig,
23    pub appearance: AppearanceConfig,
24}
25
26/// General application settings.
27#[derive(Debug, Clone, Serialize, Deserialize)]
28#[serde(default)]
29pub struct GeneralConfig {
30    pub editor: Option<String>,
31    pub default_account: Option<String>,
32    pub sync_interval: u64,
33    pub hook_timeout: u64,
34    pub attachment_dir: PathBuf,
35}
36
37/// Configuration for a single email account.
38#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct AccountConfig {
40    pub name: String,
41    pub email: String,
42    pub sync: Option<SyncProviderConfig>,
43    pub send: Option<SendProviderConfig>,
44}
45
46/// Sync provider configuration (tagged enum).
47#[derive(Debug, Clone, Serialize, Deserialize)]
48#[serde(tag = "type", rename_all = "snake_case")]
49pub enum SyncProviderConfig {
50    Gmail {
51        #[serde(default)]
52        credential_source: GmailCredentialSource,
53        client_id: String,
54        client_secret: Option<String>,
55        token_ref: String,
56    },
57    Imap {
58        host: String,
59        port: u16,
60        username: String,
61        password_ref: String,
62        use_tls: bool,
63    },
64}
65
66/// Send provider configuration (tagged enum).
67#[derive(Debug, Clone, Serialize, Deserialize)]
68#[serde(tag = "type", rename_all = "snake_case")]
69pub enum SendProviderConfig {
70    Gmail,
71    Smtp {
72        host: String,
73        port: u16,
74        username: String,
75        password_ref: String,
76        use_tls: bool,
77    },
78}
79
80/// HTML rendering configuration.
81#[derive(Debug, Clone, Serialize, Deserialize)]
82#[serde(default)]
83pub struct RenderConfig {
84    pub html_command: Option<String>,
85    pub reader_mode: bool,
86    pub show_reader_stats: bool,
87}
88
89/// Search configuration.
90#[derive(Debug, Clone, Serialize, Deserialize)]
91#[serde(default)]
92pub struct SearchConfig {
93    pub default_sort: SortOrder,
94    pub max_results: usize,
95}
96
97/// Sort order for search results (config-local, not reusing core's).
98#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
99#[serde(rename_all = "snake_case")]
100pub enum SortOrder {
101    DateDesc,
102    DateAsc,
103    Relevance,
104}
105
106/// Snooze timing configuration.
107#[derive(Debug, Clone, Serialize, Deserialize)]
108#[serde(default)]
109pub struct SnoozeConfig {
110    pub morning_hour: u8,
111    pub evening_hour: u8,
112    pub weekend_day: String,
113    pub weekend_hour: u8,
114}
115
116/// Logging / retention configuration.
117#[derive(Debug, Clone, Serialize, Deserialize)]
118#[serde(default)]
119pub struct LoggingConfig {
120    pub level: String,
121    pub max_size_mb: u32,
122    pub max_files: u32,
123    pub stderr: bool,
124    pub event_retention_days: u32,
125}
126
127/// Appearance / UI configuration.
128#[derive(Debug, Clone, Serialize, Deserialize)]
129#[serde(default)]
130pub struct AppearanceConfig {
131    pub theme: String,
132    pub sidebar: bool,
133    pub date_format: String,
134    pub date_format_full: String,
135    pub subject_max_width: usize,
136}