1use std::any::Any;
2use std::sync::Arc;
3use std::collections::HashMap;
4use async_trait::async_trait;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
8pub struct ArtifactId {
9 pub namespace: Option<String>,
10 pub name: String,
11 pub version: String,
12}
13
14#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
15#[serde(rename_all = "lowercase")]
16pub enum ArtifactFormat {
17 Maven3,
18 Pip,
19 Rust,
20 Raw,
21}
22
23#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
24#[serde(rename_all = "lowercase")]
25pub enum StorageType {
26 Znippy,
27 Rocksdb,
28}
29
30#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
31#[serde(rename_all = "lowercase")]
32pub enum RepositoryType {
33 Rust,
34 Pip,
35 Maven3,
36 Raw,
37}
38impl RepositoryType {
39 pub fn endpoint_name(&self) -> &'static str {
40 match self {
41 RepositoryType::Rust => "rust",
42 RepositoryType::Pip => "pip",
43 RepositoryType::Maven3 => "maven3",
44 RepositoryType::Raw => "raw",
45 }
46 }
47}
48
49
50#[async_trait]
51pub trait RepositoryBackendTrait: Send + Sync {
52 fn name(&self) -> &str;
53 fn format(&self) -> ArtifactFormat;
54 fn is_writable(&self) -> bool;
55
56 fn fetch(&self, id: &ArtifactId) -> anyhow::Result<Option<Vec<u8>>>;
57 fn put(&self, id: &ArtifactId, data: &[u8]) -> anyhow::Result<()>;
58
59
60 fn fetch_many_with_upstreams(
61 &self,
62 upstreams: &[Arc<dyn RepositoryBackendTrait>],
63 ids: &[ArtifactId],
64 ) -> anyhow::Result<HashMap<ArtifactId, Vec<u8>>> {
65 let mut result = HashMap::new();
66
67 for id in ids {
68 if let Some(data) = self.fetch(id)? {
69 result.insert(id.clone(), data);
70 continue;
71 }
72 for up in upstreams {
73 if let Some(data) = up.fetch(id)? {
74 result.insert(id.clone(), data);
75 break;
76 }
77 }
78 }
79 Ok(result)
80 }
81 fn handle_http2_request(
82 &self,
83 suburl: &str,
84 body: &[u8],
85 ) -> anyhow::Result<(u16, Vec<(String, String)>, Vec<u8>)>;
86
87}
88