use super::catalog::ResourceCatalog;
use super::contract::{ContractManager, InMemoryNegotiator};
use super::identity::IdentityProvider;
use super::lineage::ProvenanceGraph;
use super::policy::PolicyEngine;
use super::residency::ResidencyEnforcer;
use super::types::{IdsResult, IdsUri, Party, SecurityProfile, TransferProtocol};
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct IdsConnectorConfig {
pub connector_id: IdsUri,
pub title: String,
pub description: String,
pub curator: IdsUri,
pub maintainer: IdsUri,
pub security_profile: SecurityProfile,
pub daps_url: String,
pub broker_urls: Vec<String>,
pub gaiax_registry_url: Option<String>,
pub supported_protocols: Vec<TransferProtocol>,
}
impl Default for IdsConnectorConfig {
fn default() -> Self {
Self {
connector_id: IdsUri::new("urn:ids:connector:oxirs")
.expect("default connector URI should be valid"),
title: "OxiRS IDS Connector".to_string(),
description: "Semantic Web Data Space Connector".to_string(),
curator: IdsUri::new("https://oxirs.io").expect("default curator URI should be valid"),
maintainer: IdsUri::new("https://oxirs.io")
.expect("default maintainer URI should be valid"),
security_profile: SecurityProfile::TrustSecurityProfile,
daps_url: super::DEFAULT_DAPS_URL.to_string(),
broker_urls: vec![super::DEFAULT_IDS_BROKER.to_string()],
gaiax_registry_url: None,
supported_protocols: vec![TransferProtocol::Https, TransferProtocol::MultipartFormData],
}
}
}
pub struct IdsConnector {
config: IdsConnectorConfig,
identity: Arc<IdentityProvider>,
catalog: Arc<ResourceCatalog>,
contract_manager: Arc<ContractManager>,
policy_engine: Arc<PolicyEngine>,
lineage_tracker: Arc<ProvenanceGraph>,
residency_enforcer: Arc<ResidencyEnforcer>,
}
impl IdsConnector {
pub fn new(config: IdsConnectorConfig) -> Self {
let identity = Arc::new(IdentityProvider::new(config.daps_url.clone()));
let catalog = Arc::new(ResourceCatalog::new());
let policy_engine = Arc::new(PolicyEngine::new());
let lineage_tracker = Arc::new(ProvenanceGraph::default());
let residency_enforcer = Arc::new(ResidencyEnforcer::new());
let negotiator = Arc::new(InMemoryNegotiator::new());
let contract_manager = Arc::new(ContractManager::new(negotiator));
Self {
config,
identity,
catalog,
contract_manager,
policy_engine,
lineage_tracker,
residency_enforcer,
}
}
pub fn connector_id(&self) -> &IdsUri {
&self.config.connector_id
}
pub fn catalog(&self) -> Arc<ResourceCatalog> {
Arc::clone(&self.catalog)
}
pub fn contract_manager(&self) -> Arc<ContractManager> {
Arc::clone(&self.contract_manager)
}
pub fn policy_engine(&self) -> Arc<PolicyEngine> {
Arc::clone(&self.policy_engine)
}
pub fn lineage_tracker(&self) -> Arc<ProvenanceGraph> {
Arc::clone(&self.lineage_tracker)
}
pub fn residency_enforcer(&self) -> Arc<ResidencyEnforcer> {
Arc::clone(&self.residency_enforcer)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_connector_creation() {
let config = IdsConnectorConfig::default();
let connector = IdsConnector::new(config);
assert_eq!(connector.connector_id().as_str(), "urn:ids:connector:oxirs");
}
}