use std::sync::Arc;
use tokio::sync::Semaphore;
use crate::auth::Authorizer;
use crate::config::Config;
use crate::locks::LockStore;
use crate::metrics::Metrics;
use crate::storage::Store;
pub struct AppState {
pub store: Store,
pub locks: LockStore,
pub config: Config,
pub authorizer: Authorizer,
pub forges: std::collections::HashMap<String, Authorizer>,
pub metrics: Metrics,
pub transfers: Option<Arc<Semaphore>>,
pub started: std::time::Instant,
pub session_key: tokio::sync::OnceCell<Vec<u8>>,
}
impl AppState {
pub fn authorizer_for(
&self,
ns: &crate::namespace::Namespace,
) -> Result<&Authorizer, crate::error::Error> {
match ns.forge() {
None => Ok(&self.authorizer),
Some(forge) => self.forges.get(forge).ok_or(crate::error::Error::NotServed),
}
}
pub fn transfer_permit(
&self,
) -> Result<Option<tokio::sync::OwnedSemaphorePermit>, crate::error::Error> {
match &self.transfers {
None => Ok(None),
Some(transfers) => match transfers.clone().try_acquire_owned() {
Ok(permit) => Ok(Some(permit)),
Err(_) => Err(crate::error::Error::TransfersSaturated { retry_after: 5 }),
},
}
}
}
pub type Shared = Arc<AppState>;