use crate::{ app::constant::{ CURSOR_API2_HOST, CURSOR_HOST, DEFAULT_TOKEN_FILE_NAME, DEFAULT_TOKEN_LIST_FILE_NAME, EMPTY_STRING, }, common::utils::{parse_ascii_char_from_env, parse_string_from_env}, }; use std::sync::LazyLock; macro_rules! def_pub_static { // 基础版本:直接存储 String ($name:ident, $value:expr) => { pub static $name: LazyLock = LazyLock::new(|| $value); }; // 环境变量版本 ($name:ident, env: $env_key:expr, default: $default:expr) => { pub static $name: LazyLock = LazyLock::new(|| parse_string_from_env($env_key, $default).trim().to_string()); }; } // macro_rules! def_pub_static_getter { // ($name:ident) => { // paste::paste! { // pub fn []() -> String { // (*$name).clone() // } // } // }; // } def_pub_static!(ROUTE_PREFIX, env: "ROUTE_PREFIX", default: EMPTY_STRING); def_pub_static!(AUTH_TOKEN, env: "AUTH_TOKEN", default: EMPTY_STRING); def_pub_static!(TOKEN_FILE, env: "TOKEN_FILE", default: DEFAULT_TOKEN_FILE_NAME); def_pub_static!(TOKEN_LIST_FILE, env: "TOKEN_LIST_FILE", default: DEFAULT_TOKEN_LIST_FILE_NAME); def_pub_static!(ROUTE_MODELS_PATH, format!("{}/v1/models", *ROUTE_PREFIX)); def_pub_static!( ROUTE_CHAT_PATH, format!("{}/v1/chat/completions", *ROUTE_PREFIX) ); pub static START_TIME: LazyLock> = LazyLock::new(chrono::Local::now); pub fn get_start_time() -> chrono::DateTime { *START_TIME } def_pub_static!(DEFAULT_INSTRUCTIONS, env: "DEFAULT_INSTRUCTIONS", default: "Respond in Chinese by default"); def_pub_static!(REVERSE_PROXY_HOST, env: "REVERSE_PROXY_HOST", default: EMPTY_STRING); def_pub_static!(SHARED_AUTH_TOKEN, env: "SHARED_AUTH_TOKEN", default: EMPTY_STRING); pub static USE_SHARE: LazyLock = LazyLock::new(|| !SHARED_AUTH_TOKEN.is_empty()); pub static TOKEN_DELIMITER: LazyLock = LazyLock::new(|| { let delimiter = parse_ascii_char_from_env("TOKEN_DELIMITER", ','); if delimiter.is_ascii_alphabetic() || delimiter.is_ascii_digit() || delimiter == '+' || delimiter == '/' { ',' } else { delimiter } }); pub static TOKEN_DELIMITER_LEN: LazyLock = LazyLock::new(|| TOKEN_DELIMITER.len_utf8()); pub static USE_PROXY: LazyLock = LazyLock::new(|| !REVERSE_PROXY_HOST.is_empty()); pub static CURSOR_API2_CHAT_URL: LazyLock = LazyLock::new(|| { let host = if *USE_PROXY { &*REVERSE_PROXY_HOST } else { CURSOR_API2_HOST }; format!("https://{}/aiserver.v1.AiService/StreamChat", host) }); pub static CURSOR_API2_STRIPE_URL: LazyLock = LazyLock::new(|| { let host = if *USE_PROXY { &*REVERSE_PROXY_HOST } else { CURSOR_API2_HOST }; format!("https://{}/auth/full_stripe_profile", host) }); pub static CURSOR_USAGE_API_URL: LazyLock = LazyLock::new(|| { let host = if *USE_PROXY { &*REVERSE_PROXY_HOST } else { CURSOR_HOST }; format!("https://{}/api/usage", host) }); pub static CURSOR_USER_API_URL: LazyLock = LazyLock::new(|| { let host = if *USE_PROXY { &*REVERSE_PROXY_HOST } else { CURSOR_HOST }; format!("https://{}/api/auth/me", host) }); // pub static DEBUG: LazyLock = LazyLock::new(|| parse_bool_from_env("DEBUG", false)); // #[macro_export] // macro_rules! debug_println { // ($($arg:tt)*) => { // if *crate::app::statics::DEBUG { // println!($($arg)*); // } // }; // }