holger_ron/repository/
mod.rs

1mod types;
2
3use std::sync::Arc;
4use serde::{Deserialize, Serialize};
5use holger_rust_repository::RustRepo;
6use holger_traits::RepositoryBackendTrait;
7use crate::{ExposedEndpoint, StorageEndpoint};
8
9#[derive(Serialize, Deserialize)]
10pub struct Repository {
11    // Parsed from RON
12    pub ron_name: String,
13    pub ron_repo_type: String,        // rust/java/python/raw
14    pub ron_upstreams: Vec<String>,   // empty means no upstreams
15    pub ron_in: Option<RepositoryIO>,
16    pub ron_out: Option<RepositoryIO>,
17
18    // Wired in second pass
19    #[serde(skip_serializing, skip_deserializing, default)]
20    pub backend_repository: Option<Arc<dyn RepositoryBackendTrait>>,
21    
22
23
24    #[serde(skip_serializing, skip_deserializing, default)]
25    pub wired_upstreams: Vec<*const Repository>, // or &Repository pinned after build
26}
27impl Repository {
28    pub fn backend_from_config(&mut self) -> anyhow::Result<()> {
29        match self.ron_repo_type.as_str() {
30            "rust" => {
31                self.backend_repository = Some(Arc::new(RustRepo {
32                    name: self.ron_name.clone(),
33                    artifacts: vec![],
34                }));
35                Ok(())
36            }
37            other => anyhow::bail!("Unsupported repository type: {}", other),
38        }
39    }
40
41}
42
43
44
45
46#[derive(Serialize, Deserialize)]
47pub struct RepositoryIO {
48    pub ron_storage_endpoint: String,
49    pub ron_exposed_endpoint: String,
50
51
52    #[serde(skip_serializing, skip_deserializing, default = "std::ptr::null")]
53    pub wired_storage: *const StorageEndpoint,
54    #[serde(skip_serializing, skip_deserializing, default = "std::ptr::null")]
55    pub wired_exposed: *const ExposedEndpoint,
56}