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#[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#[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#[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#[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#[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#[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#[derive(Debug, Clone, Serialize, Deserialize)]
91#[serde(default)]
92pub struct SearchConfig {
93 pub default_sort: SortOrder,
94 pub max_results: usize,
95}
96
97#[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#[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#[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#[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}