holger_traits/
lib.rs

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