Skip to main content

agentics_storage/
factory.rs

1use std::path::{Path, PathBuf};
2use std::sync::Arc;
3
4use crate::{
5    LocalStorage, LocalStorageOptions, Result, S3Storage, S3StorageOptions, Storage, StorageError,
6};
7
8/// Backend-specific durable storage construction options.
9#[derive(Debug, Clone)]
10pub enum StorageFactoryOptions {
11    Local(LocalStorageOptions),
12    S3(S3StorageOptions),
13}
14
15/// Build the configured durable storage backend.
16pub async fn build_storage(options: StorageFactoryOptions) -> anyhow::Result<Arc<dyn Storage>> {
17    match options {
18        StorageFactoryOptions::Local(options) => Ok(Arc::new(LocalStorage::from_options(options))),
19        StorageFactoryOptions::S3(options) => Ok(Arc::new(S3Storage::from_options(options).await?)),
20    }
21}
22
23/// Return the host-local work root for object storage staging and materialization.
24pub fn storage_work_root(work_root: Option<&Path>) -> Result<PathBuf> {
25    let root = work_root
26        .filter(|value| !value.as_os_str().is_empty())
27        .map(Path::to_path_buf)
28        .unwrap_or_else(|| std::env::temp_dir().join("agentics-storage-work"));
29    if !root.is_absolute() {
30        return Err(StorageError::InvalidKey(
31            "AGENTICS_STORAGE_WORK_ROOT must be an absolute path".to_string(),
32        ));
33    }
34    Ok(root)
35}