1#[cfg(not(target_arch = "riscv64"))]
2use rustls::crypto::aws_lc_rs;
3#[cfg(target_arch = "riscv64")]
4use rustls::crypto::ring;
5use std::env;
6use std::path::PathBuf;
7use std::{sync::LazyLock, time::Duration};
8
9pub fn get_app_config_dir() -> PathBuf {
10 if let Ok(xdg) = env::var("XDG_CONFIG_HOME") {
11 PathBuf::from(xdg).join("aico")
12 } else {
13 let home = env::var("HOME")
14 .map(PathBuf::from)
15 .unwrap_or_else(|_| PathBuf::from("."));
16 home.join(".config").join("aico")
17 }
18}
19
20pub fn get_app_cache_dir() -> PathBuf {
21 if let Ok(custom) = env::var("AICO_CACHE_DIR") {
22 return PathBuf::from(custom);
23 }
24 if let Ok(xdg) = env::var("XDG_CACHE_HOME") {
25 PathBuf::from(xdg).join("aico")
26 } else {
27 let home = env::var("HOME")
28 .map(PathBuf::from)
29 .unwrap_or_else(|_| PathBuf::from("."));
30 home.join(".cache").join("aico")
31 }
32}
33
34pub fn setup_crypto_provider() {
35 static DONE: LazyLock<()> = LazyLock::new(|| {
36 if rustls::crypto::CryptoProvider::get_default().is_none() {
37 #[cfg(target_arch = "riscv64")]
38 let provider = ring::default_provider();
39
40 #[cfg(not(target_arch = "riscv64"))]
41 let provider = aws_lc_rs::default_provider();
42
43 let _ = provider.install_default();
44 }
45 });
46 *DONE;
47}
48
49pub fn setup_http_client() -> reqwest::Client {
50 setup_crypto_provider();
51
52 reqwest::Client::builder()
53 .connect_timeout(Duration::from_secs(10))
54 .pool_idle_timeout(Duration::from_secs(90))
55 .tcp_keepalive(Duration::from_secs(30))
56 .build()
57 .unwrap_or_else(|_| reqwest::Client::new())
58}