lcode_config/config/
mod.rs1pub 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#[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, }
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 pub fn new(tongue: Suffix) -> Self {
96 let config = Config::new(tongue);
97 Self { config, ..Default::default() }
98 }
99
100 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 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}