use std::collections::BTreeMap;
use std::sync::Arc;
use axum::Router;
use axum::routing::get;
use ferro_blob_store::BlobStore;
use tokio::sync::RwLock;
use crate::handlers::{handle_delete, handle_get, handle_head, handle_put};
use crate::metadata::MavenMetadata;
pub type MetadataKey = (String, String, String, Option<String>);
pub type MetadataCache = Arc<RwLock<BTreeMap<MetadataKey, MavenMetadata>>>;
pub type SnapshotCounter = Arc<RwLock<BTreeMap<(String, String, String, String), u32>>>;
#[derive(Clone)]
pub struct MavenState {
pub blobs: Arc<dyn BlobStore>,
pub layout: Arc<RwLock<BTreeMap<String, ferro_blob_store::Digest>>>,
pub metadata: MetadataCache,
pub snapshot_counter: SnapshotCounter,
}
impl MavenState {
#[must_use]
pub fn new(blobs: Arc<dyn BlobStore>) -> Self {
Self {
blobs,
layout: Arc::new(RwLock::new(BTreeMap::new())),
metadata: Arc::new(RwLock::new(BTreeMap::new())),
snapshot_counter: Arc::new(RwLock::new(BTreeMap::new())),
}
}
}
pub fn router(state: MavenState) -> Router {
Router::new()
.route(
"/repository/{repo}/{*path}",
get(handle_get)
.head(handle_head)
.put(handle_put)
.delete(handle_delete),
)
.with_state(state)
}