use super::{EventBus, RuntimeInner, TilesRuntime};
use crate::{CacheType, ContainerRegistry, ProgressFactory};
use std::sync::{Arc, Mutex};
pub struct RuntimeBuilder {
cache_type: Option<CacheType>,
#[allow(clippy::type_complexity)]
registry_customizer: Vec<Box<dyn FnOnce(&mut ContainerRegistry)>>,
silent_progress: bool,
}
impl RuntimeBuilder {
#[must_use]
pub fn new() -> Self {
Self {
cache_type: None,
registry_customizer: Vec::new(),
#[cfg(not(test))]
silent_progress: false,
#[cfg(test)]
silent_progress: true,
}
}
#[must_use]
pub fn cache_type(mut self, cache_type: CacheType) -> Self {
self.cache_type = Some(cache_type);
self
}
#[must_use]
pub fn with_memory_cache(self) -> Self {
self.cache_type(CacheType::new_memory())
}
#[must_use]
pub fn with_disk_cache(self, path: &std::path::Path) -> Self {
self.cache_type(CacheType::Disk(path.to_path_buf()))
}
#[must_use]
pub fn silent_progress(mut self, silent: bool) -> Self {
self.silent_progress = silent;
self
}
#[must_use]
pub fn customize_registry<F>(mut self, customizer: F) -> Self
where
F: Fn(&mut ContainerRegistry) + 'static,
{
self.registry_customizer.push(Box::new(customizer));
self
}
pub fn build(self) -> TilesRuntime {
let cache_type = self.cache_type.unwrap_or_else(CacheType::new_memory);
let event_bus = EventBus::new();
let progress_factory = Mutex::new(ProgressFactory::new(event_bus.clone(), self.silent_progress));
let mut registry = ContainerRegistry::default();
for customizer in self.registry_customizer {
customizer(&mut registry);
}
TilesRuntime {
inner: Arc::new(RuntimeInner {
cache_type,
registry,
event_bus,
progress_factory,
}),
}
}
}
impl Default for RuntimeBuilder {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use std::path::{Path, PathBuf};
use super::*;
#[test]
fn test_runtime_builder_new() {
let builder = RuntimeBuilder::new();
assert!(builder.cache_type.is_none());
assert!(builder.silent_progress);
assert_eq!(builder.registry_customizer.len(), 0);
}
#[test]
fn test_runtime_builder_default() {
let builder = RuntimeBuilder::default();
assert!(builder.cache_type.is_none());
assert!(builder.silent_progress);
}
#[test]
fn test_runtime_builder_with_memory_cache() {
let builder = RuntimeBuilder::new().with_memory_cache();
assert!(builder.cache_type.is_some());
}
#[test]
fn test_runtime_builder_with_disk_cache() {
let builder = RuntimeBuilder::new().with_disk_cache(Path::new("/tmp/cache"));
assert!(builder.cache_type.is_some());
}
#[test]
fn test_runtime_builder_silent() {
let mut builder = RuntimeBuilder::new();
builder = builder.silent_progress(true);
assert!(builder.silent_progress);
builder = builder.silent_progress(false);
assert!(!builder.silent_progress);
}
#[test]
fn test_runtime_builder_customize_registry() {
let builder = RuntimeBuilder::new().customize_registry(|_registry| {
});
assert_eq!(builder.registry_customizer.len(), 1);
}
#[test]
fn test_runtime_builder_multiple_customizers() {
let builder = RuntimeBuilder::new()
.customize_registry(|_registry| {})
.customize_registry(|_registry| {});
assert_eq!(builder.registry_customizer.len(), 2);
}
#[test]
fn test_runtime_builder_chaining() {
let builder = RuntimeBuilder::new()
.with_memory_cache()
.silent_progress(true)
.customize_registry(|_| {});
assert!(builder.cache_type.is_some());
assert!(builder.silent_progress);
assert_eq!(builder.registry_customizer.len(), 1);
}
#[test]
fn test_runtime_builder_build() {
let runtime = RuntimeBuilder::new().build();
let _events = runtime.events();
}
#[test]
fn test_runtime_builder_build_with_memory_cache() {
let runtime = RuntimeBuilder::new().with_memory_cache().build();
assert_eq!(runtime.cache_type(), &CacheType::InMemory);
}
#[test]
fn test_runtime_builder_build_with_disk_cache() {
let path_buf = PathBuf::from("/tmp/test_cache");
let runtime = RuntimeBuilder::new().with_disk_cache(&path_buf).build();
assert_eq!(runtime.cache_type(), &CacheType::Disk(path_buf));
}
#[test]
fn test_runtime_builder_build_silent() {
let runtime = RuntimeBuilder::new().silent_progress(true).build();
let progress = runtime.create_progress("Test", 100);
progress.inc(10);
}
#[test]
fn test_runtime_builder_build_default_cache() {
let runtime = RuntimeBuilder::new().build();
assert_eq!(runtime.cache_type(), &CacheType::InMemory);
}
#[test]
fn test_runtime_builder_build_with_customizer() {
let builder = RuntimeBuilder::new().customize_registry(|_registry| {
});
let _runtime = builder.build();
}
#[test]
fn test_runtime_builder_full_configuration() {
let path_buf = PathBuf::from("/tmp/full_config_cache");
let runtime = RuntimeBuilder::new()
.with_disk_cache(&path_buf)
.silent_progress(true)
.customize_registry(|_| {})
.build();
assert_eq!(runtime.cache_type(), &CacheType::Disk(path_buf));
}
}