lcode_config/config/
mod.rs

1pub mod read_config;
2pub mod user_nested;
3mod user_serializes;
4
5use std::{collections::VecDeque, path::PathBuf};
6
7use decrypt_cookies::browser::cookies::LeetCodeCookies;
8use serde::{Deserialize, Serialize};
9use user_nested::*;
10
11use self::user_serializes::*;
12use crate::{global, keymap::TuiKeyMap};
13
14/// config for user
15#[derive(Clone)]
16#[derive(Debug)]
17#[derive(PartialEq, Eq)]
18#[derive(Serialize, Deserialize)]
19#[derive(Default)]
20pub struct LcodeConfig {
21    #[serde(skip)]
22    pub urls: Urls,
23    #[serde(default)]
24    pub config: Config,
25    #[serde(default)]
26    pub cookies: LeetCodeCookies,
27    #[serde(default)]
28    pub langs: SupportLang,
29    #[serde(default)]
30    pub keymap: TuiKeyMap,
31}
32
33#[derive(Clone)]
34#[derive(Debug)]
35#[derive(PartialEq, Eq)]
36#[derive(Serialize, Deserialize)]
37pub struct Config {
38    #[serde(default)]
39    pub translate: bool,
40    #[serde(default, with = "user_serializes")]
41    pub url_suffix: Suffix,
42    #[serde(default)]
43    pub column: usize,
44    #[serde(default)]
45    pub num_sublist: u32,
46    #[serde(default)]
47    pub page_size: usize,
48    #[serde(default = "default_editor")]
49    pub editor: VecDeque<String>,
50    #[serde(default = "lang_default")]
51    pub lang: String,
52    #[serde(default = "default_code_dir")]
53    pub code_dir: PathBuf,
54    #[serde(default)]
55    pub browser: String,
56    #[serde(default = "default_true")]
57    pub cargo_integr: bool,
58    #[serde(default)]
59    /// create qs dir use frontend id
60    pub dir_with_frontend_id: bool,
61    #[serde(default)]
62    pub show_avatar: bool,
63}
64
65impl Config {
66    pub fn new(suffix: Suffix) -> Self {
67        let (url_suffix, translate) = match suffix {
68            Suffix::Cn => (Suffix::Cn, true),
69            Suffix::Com => (Suffix::Com, false),
70        };
71        Self {
72            translate,
73            url_suffix,
74            ..Default::default()
75        }
76    }
77}
78impl Default for Config {
79    fn default() -> Self {
80        Self {
81            translate: false,
82            column: 4,
83            num_sublist: 16,
84            page_size: 25,
85            url_suffix: Suffix::default(),
86            editor: default_editor(),
87            lang: "rust".to_owned(),
88            code_dir: default_code_dir(),
89            browser: String::new(),
90            cargo_integr: true,
91            dir_with_frontend_id: false,
92            show_avatar: false,
93        }
94    }
95}
96
97impl LcodeConfig {
98    ///  "cn"  "en"
99    pub fn new(tongue: Suffix) -> Self {
100        let config = Config::new(tongue);
101        Self { config, ..Default::default() }
102    }
103
104    /// `start`, `end`, `inject_end`, `inject_end`
105    pub fn get_lang_info(&self) -> (String, String, String, String) {
106        macro_rules! return_info_macro {
107            ($($struct_name:ident),*) => {
108                match self.config.lang.as_str() {
109                    $(
110                        stringify!($struct_name) => self.langs.$struct_name.return_info(),
111                    )*
112                    _ => self.langs.rust.return_info(),
113                }
114            };
115        }
116
117        return_info_macro!(
118            rust, bash, c, cpp, csharp, golang, java, javascript, kotlin, mysql, php, python,
119            python3, ruby, scala, swift, typescript, racket, erlang, elixir, dart
120        )
121    }
122
123    /// get code file suffix
124    pub fn get_suffix(&self) -> &str {
125        let sp_lang = &global::G_SUPPORT_LANGS;
126        sp_lang
127            .get(self.config.lang.as_str())
128            .copied()
129            .unwrap_or_default()
130    }
131}