1use std::path::PathBuf;
2use serde::{Deserialize, Serialize};
3
4fn default_save_to_history() -> bool {
5 true
6}
7
8fn default_multicast_address() -> String {
9 "224.0.0.167".to_string()
10}
11
12fn default_share_link_auto_accept() -> bool {
13 false
14}
15
16fn default_share_link_require_pin() -> bool {
17 true
18}
19
20pub fn generate_share_link_pin() -> String {
22 use rand::Rng;
23 const CHARSET: &[u8] = b"23456789abcdefghjkmnpqrstuvwxyz";
24 let mut rng = rand::rng();
25 (0..6)
26 .map(|_| {
27 let idx = rng.random_range(0..CHARSET.len());
28 CHARSET[idx] as char
29 })
30 .collect()
31}
32
33fn default_share_link_pin() -> String {
34 generate_share_link_pin()
35}
36
37#[derive(Clone, Debug, Serialize, Deserialize)]
39pub struct AppConfig {
40 pub alias: String,
41 pub port: u16,
42 pub download_dir: PathBuf,
43 pub auto_accept: bool,
44 pub pin: Option<String>,
45 #[serde(default = "default_save_to_history")]
46 pub save_to_history: bool,
47 #[serde(default = "default_multicast_address")]
48 pub multicast_address: String,
49 #[serde(default = "default_share_link_auto_accept")]
50 pub share_link_auto_accept: bool,
51 #[serde(default = "default_share_link_require_pin")]
52 pub share_link_require_pin: bool,
53 #[serde(default = "default_share_link_pin")]
54 pub share_link_pin: String,
55}
56
57impl Default for AppConfig {
58 fn default() -> Self {
59 #[cfg(target_os = "android")]
60 let download_dir = PathBuf::from("/storage/emulated/0/Download");
61 #[cfg(not(target_os = "android"))]
62 let download_dir = dirs::download_dir().unwrap_or_else(|| PathBuf::from("."));
63
64 Self {
65
66 alias: "LanFlare Node".to_string(),
67 port: 53317,
68 download_dir,
69 auto_accept: false,
70
71 pin: None,
72 save_to_history: true,
73 multicast_address: default_multicast_address(),
74 share_link_auto_accept: false,
75 share_link_require_pin: true,
76 share_link_pin: generate_share_link_pin(),
77 }
78 }
79}