devin15/cursor2api-rust
0
1use crate::{2 app::constant::{3 CURSOR_API2_HOST, CURSOR_HOST, DEFAULT_TOKEN_FILE_NAME, DEFAULT_TOKEN_LIST_FILE_NAME,4 EMPTY_STRING,5 },6 common::utils::{parse_ascii_char_from_env, parse_string_from_env},7};8use std::sync::LazyLock;9 10macro_rules! def_pub_static {11 // 基础版本:直接存储 String12 ($name:ident, $value:expr) => {13 pub static $name: LazyLock<String> = LazyLock::new(|| $value);14 };15 16 // 环境变量版本17 ($name:ident, env: $env_key:expr, default: $default:expr) => {18 pub static $name: LazyLock<String> =19 LazyLock::new(|| parse_string_from_env($env_key, $default).trim().to_string());20 };21}22 23// macro_rules! def_pub_static_getter {24// ($name:ident) => {25// paste::paste! {26// pub fn [<get_ $name:lower>]() -> String {27// (*$name).clone()28// }29// }30// };31// }32 33def_pub_static!(ROUTE_PREFIX, env: "ROUTE_PREFIX", default: EMPTY_STRING);34def_pub_static!(AUTH_TOKEN, env: "AUTH_TOKEN", default: EMPTY_STRING);35def_pub_static!(TOKEN_FILE, env: "TOKEN_FILE", default: DEFAULT_TOKEN_FILE_NAME);36def_pub_static!(TOKEN_LIST_FILE, env: "TOKEN_LIST_FILE", default: DEFAULT_TOKEN_LIST_FILE_NAME);37def_pub_static!(ROUTE_MODELS_PATH, format!("{}/v1/models", *ROUTE_PREFIX));38def_pub_static!(39 ROUTE_CHAT_PATH,40 format!("{}/v1/chat/completions", *ROUTE_PREFIX)41);42 43pub static START_TIME: LazyLock<chrono::DateTime<chrono::Local>> =44 LazyLock::new(chrono::Local::now);45 46pub fn get_start_time() -> chrono::DateTime<chrono::Local> {47 *START_TIME48}49 50def_pub_static!(DEFAULT_INSTRUCTIONS, env: "DEFAULT_INSTRUCTIONS", default: "Respond in Chinese by default");51 52def_pub_static!(REVERSE_PROXY_HOST, env: "REVERSE_PROXY_HOST", default: EMPTY_STRING);53 54def_pub_static!(SHARED_AUTH_TOKEN, env: "SHARED_AUTH_TOKEN", default: EMPTY_STRING);55 56pub static USE_SHARE: LazyLock<bool> = LazyLock::new(|| !SHARED_AUTH_TOKEN.is_empty());57 58pub static TOKEN_DELIMITER: LazyLock<char> = LazyLock::new(|| {59 let delimiter = parse_ascii_char_from_env("TOKEN_DELIMITER", ',');60 if delimiter.is_ascii_alphabetic()61 || delimiter.is_ascii_digit()62 || delimiter == '+'63 || delimiter == '/'64 {65 ','66 } else {67 delimiter68 }69});70 71pub static TOKEN_DELIMITER_LEN: LazyLock<usize> = LazyLock::new(|| TOKEN_DELIMITER.len_utf8());72 73pub static USE_PROXY: LazyLock<bool> = LazyLock::new(|| !REVERSE_PROXY_HOST.is_empty());74 75pub static CURSOR_API2_CHAT_URL: LazyLock<String> = LazyLock::new(|| {76 let host = if *USE_PROXY {77 &*REVERSE_PROXY_HOST78 } else {79 CURSOR_API2_HOST80 };81 format!("https://{}/aiserver.v1.AiService/StreamChat", host)82});83 84pub static CURSOR_API2_STRIPE_URL: LazyLock<String> = LazyLock::new(|| {85 let host = if *USE_PROXY {86 &*REVERSE_PROXY_HOST87 } else {88 CURSOR_API2_HOST89 };90 format!("https://{}/auth/full_stripe_profile", host)91});92 93pub static CURSOR_USAGE_API_URL: LazyLock<String> = LazyLock::new(|| {94 let host = if *USE_PROXY {95 &*REVERSE_PROXY_HOST96 } else {97 CURSOR_HOST98 };99 format!("https://{}/api/usage", host)100});101 102pub static CURSOR_USER_API_URL: LazyLock<String> = LazyLock::new(|| {103 let host = if *USE_PROXY {104 &*REVERSE_PROXY_HOST105 } else {106 CURSOR_HOST107 };108 format!("https://{}/api/auth/me", host)109});110 111// pub static DEBUG: LazyLock<bool> = LazyLock::new(|| parse_bool_from_env("DEBUG", false));112 113// #[macro_export]114// macro_rules! debug_println {115// ($($arg:tt)*) => {116// if *crate::app::statics::DEBUG {117// println!($($arg)*);118// }119// };120// }121 