1use std::sync::Arc;
2
3use axum::extract::FromRef;
4use axum_extra::extract::cookie::Key;
5use flume::Sender;
6use kellnr_common::cratesio_prefetch_msg::CratesioPrefetchMsg;
7use kellnr_common::token_cache::TokenCacheManager;
8use kellnr_db::DbProvider;
9use kellnr_db::download_counter::DownloadCounter;
10use kellnr_settings::{Settings, SettingsProv};
11use kellnr_storage::cached_crate_storage::DynStorage;
12use kellnr_storage::cratesio_crate_storage::CratesIoCrateStorage;
13use kellnr_storage::fs_storage::FSStorage;
14use kellnr_storage::kellnr_crate_storage::KellnrCrateStorage;
15use kellnr_storage::toolchain_storage::ToolchainStorage;
16use reqwest::Client;
17
18pub type AppState = axum::extract::State<AppStateData>;
19
20pub type DbState = axum::extract::State<Arc<dyn DbProvider>>;
22pub type SettingsState = axum::extract::State<Arc<Settings>>;
23pub type SettingsProvState = axum::extract::State<Arc<SettingsProv>>;
24pub type CrateStorageState = axum::extract::State<Arc<KellnrCrateStorage>>;
25pub type CrateIoStorageState = axum::extract::State<Arc<CratesIoCrateStorage>>;
26pub type SigningKeyState = axum::extract::State<Key>;
27pub type CratesIoPrefetchSenderState = axum::extract::State<Sender<CratesioPrefetchMsg>>;
28pub type TokenCacheState = axum::extract::State<Arc<TokenCacheManager>>;
29pub type ToolchainStorageState = axum::extract::State<Option<Arc<ToolchainStorage>>>;
30pub type DownloadCounterState = axum::extract::State<Arc<DownloadCounter>>;
31pub type ProxyClientState = axum::extract::State<Client>;
32
33#[derive(Clone, FromRef)]
34pub struct AppStateData {
35 pub db: Arc<dyn DbProvider>,
36 pub signing_key: Key,
38 pub settings: Arc<Settings>,
39 pub settings_prov: Arc<SettingsProv>,
42 pub crate_storage: Arc<KellnrCrateStorage>,
43 pub cratesio_storage: Arc<CratesIoCrateStorage>,
44 pub cratesio_prefetch_sender: Sender<CratesioPrefetchMsg>,
45 pub token_cache: Arc<TokenCacheManager>,
46 pub toolchain_storage: Option<Arc<ToolchainStorage>>,
47 pub download_counter: Arc<DownloadCounter>,
48 pub proxy_client: Client,
49}
50
51#[must_use]
55pub fn default_settings_prov() -> Arc<SettingsProv> {
56 Arc::new(
57 provcfg::Config::new()
58 .build::<SettingsProv>()
59 .expect("default SettingsProv build is infallible"),
60 )
61}
62
63pub fn test_state() -> AppStateData {
64 let db: Arc<dyn DbProvider> = Arc::new(kellnr_db::mock::MockDb::new());
65 let signing_key = Key::generate();
66 let settings = Arc::new(kellnr_settings::test_settings());
67 let settings_prov = default_settings_prov();
68 let kellnr_storage = Box::new(FSStorage::new(&settings.crates_path()).unwrap()) as DynStorage;
69 let crate_storage = Arc::new(KellnrCrateStorage::new(&settings, kellnr_storage));
70 let cratesio_storage = Arc::new(CratesIoCrateStorage::new(
71 &settings,
72 Box::new(FSStorage::new(&settings.crates_io_path()).unwrap()) as DynStorage,
73 ));
74 let (cratesio_prefetch_sender, _) = flume::unbounded();
75 let token_cache = Arc::new(TokenCacheManager::new(false, 60, 1000));
76 let download_counter = Arc::new(DownloadCounter::new(db.clone(), 30));
77 AppStateData {
78 db,
79 signing_key,
80 settings,
81 settings_prov,
82 crate_storage,
83 cratesio_storage,
84 cratesio_prefetch_sender,
85 token_cache,
86 toolchain_storage: None, download_counter,
88 proxy_client: kellnr_common::cratesio_downloader::CLIENT.clone(),
89 }
90}