use crate::Cuenv;
use crate::provider::{RuntimeCapability, SecretCapability, SyncCapability};
use crate::providers::{CiProvider, CodegenProvider, RulesProvider};
use crate::registry::ProviderRegistry;
pub struct CuenvBuilder {
registry: ProviderRegistry,
}
impl CuenvBuilder {
#[must_use]
pub fn new() -> Self {
Self {
registry: ProviderRegistry::new(),
}
}
#[must_use]
pub fn with_sync_provider<P>(mut self, provider: P) -> Self
where
P: SyncCapability + 'static,
{
self.registry.register_sync(provider);
self
}
#[must_use]
pub fn with_runtime_provider<P>(mut self, provider: P) -> Self
where
P: RuntimeCapability + 'static,
{
self.registry.register_runtime(provider);
self
}
#[must_use]
pub fn with_secret_provider<P>(mut self, provider: P) -> Self
where
P: SecretCapability + 'static,
{
self.registry.register_secret(provider);
self
}
#[must_use]
pub fn with_defaults(self) -> Self {
self.with_sync_provider(CiProvider::new())
.with_sync_provider(CodegenProvider::new())
.with_sync_provider(RulesProvider::new())
}
#[must_use]
pub fn build(self) -> Cuenv {
Cuenv {
registry: self.registry,
}
}
}
impl Default for CuenvBuilder {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_builder_new() {
let builder = CuenvBuilder::new();
let cuenv = builder.build();
assert!(cuenv.registry.is_empty());
}
#[test]
fn test_builder_with_defaults() {
let builder = CuenvBuilder::new().with_defaults();
let cuenv = builder.build();
assert_eq!(cuenv.registry.sync_provider_count(), 3);
}
#[test]
fn test_builder_default_trait() {
let builder = CuenvBuilder::default();
let cuenv = builder.build();
assert!(cuenv.registry.is_empty());
}
#[test]
fn test_builder_with_sync_provider() {
let builder = CuenvBuilder::new().with_sync_provider(CiProvider::new());
let cuenv = builder.build();
assert_eq!(cuenv.registry.sync_provider_count(), 1);
}
#[test]
fn test_builder_with_multiple_sync_providers() {
let builder = CuenvBuilder::new()
.with_sync_provider(CiProvider::new())
.with_sync_provider(CodegenProvider::new());
let cuenv = builder.build();
assert_eq!(cuenv.registry.sync_provider_count(), 2);
}
#[test]
fn test_builder_chaining() {
let cuenv = CuenvBuilder::new()
.with_sync_provider(CiProvider::new())
.with_sync_provider(RulesProvider::new())
.build();
assert_eq!(cuenv.registry.sync_provider_count(), 2);
}
#[test]
fn test_builder_defaults_then_more() {
let builder = CuenvBuilder::new()
.with_defaults()
.with_sync_provider(CiProvider::new()); let cuenv = builder.build();
assert_eq!(cuenv.registry.sync_provider_count(), 4);
}
}