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 = "cargo_default")]
57    pub cargo_integr: bool,
58    #[serde(default = "default_ser_bool")]
59    pub dir_with_frontend_id: bool, // create qs dir use frontend id
60}
61
62impl Config {
63    pub fn new(suffix: Suffix) -> Self {
64        let (url_suffix, translate) = match suffix {
65            Suffix::Cn => (Suffix::Cn, true),
66            Suffix::Com => (Suffix::Com, false),
67        };
68        Self {
69            translate,
70            url_suffix,
71            ..Default::default()
72        }
73    }
74}
75impl Default for Config {
76    fn default() -> Self {
77        Self {
78            translate: false,
79            column: 4,
80            num_sublist: 16,
81            page_size: 25,
82            url_suffix: Suffix::default(),
83            editor: default_editor(),
84            lang: "rust".to_owned(),
85            code_dir: default_code_dir(),
86            browser: String::new(),
87            cargo_integr: true,
88            dir_with_frontend_id: false,
89        }
90    }
91}
92
93impl LcodeConfig {
94    ///  "cn"  "en"
95    pub fn new(tongue: Suffix) -> Self {
96        let config = Config::new(tongue);
97        Self { config, ..Default::default() }
98    }
99
100    /// `start`, `end`, `inject_end`, `inject_end`
101    pub fn get_lang_info(&self) -> (String, String, String, String) {
102        macro_rules! return_info_macro {
103            ($($struct_name:ident),*) => {
104                match self.config.lang.as_str() {
105                    $(
106                        stringify!($struct_name) => self.langs.$struct_name.return_info(),
107                    )*
108                    _ => self.langs.rust.return_info(),
109                }
110            };
111        }
112
113        return_info_macro!(
114            rust, bash, c, cpp, csharp, golang, java, javascript, kotlin, mysql, php, python,
115            python3, ruby, scala, swift, typescript, racket, erlang, elixir, dart
116        )
117    }
118
119    /// get code file suffix
120    pub fn get_suffix(&self) -> &str {
121        let sp_lang = &global::G_SUPPORT_LANGS;
122        sp_lang
123            .get(self.config.lang.as_str())
124            .copied()
125            .unwrap_or_default()
126    }
127}