pub mod changes;
pub mod incremental;
mod key;
pub mod serialize;
mod storage;
pub use changes::{ChangeDetector, ChangeSet};
pub use incremental::IncrementalCache;
pub use key::CacheKey;
pub use serialize::{CacheMetadata, CachedBuild};
pub use storage::{CacheError, CacheStore};
use std::path::{Path, PathBuf};
#[derive(Debug, Clone)]
pub struct CacheConfig {
pub dir: PathBuf,
pub force_rebuild: bool,
pub env_vars: Vec<String>,
}
impl CacheConfig {
pub fn new(dir: impl Into<PathBuf>) -> Self {
Self {
dir: dir.into(),
force_rebuild: false,
env_vars: Vec::new(),
}
}
pub fn with_force_rebuild(mut self, force: bool) -> Self {
self.force_rebuild = force;
self
}
pub fn with_env_vars(mut self, vars: impl IntoIterator<Item = impl Into<String>>) -> Self {
self.env_vars = vars.into_iter().map(Into::into).collect();
self
}
pub fn should_force_rebuild(&self) -> bool {
self.force_rebuild || std::env::var_os("FOB_FORCE_REBUILD").is_some()
}
}
impl Default for CacheConfig {
fn default() -> Self {
Self::new(".cache/fob")
}
}
pub type CacheResult<T> = std::result::Result<T, CacheError>;
pub fn try_load(store: &CacheStore, key: &CacheKey) -> CacheResult<CachedBuild> {
store.get(key)
}
pub fn try_save(store: &CacheStore, key: &CacheKey, build: &CachedBuild) -> CacheResult<()> {
store.put(key, build)
}
pub(crate) fn compute_cache_key(
plan: &crate::builders::common::BundlePlan,
config: &CacheConfig,
) -> CacheResult<CacheKey> {
key::compute_cache_key(plan, config)
}
pub fn open_store(cache_dir: &Path) -> CacheResult<CacheStore> {
CacheStore::open(cache_dir)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_cache_config_defaults() {
let config = CacheConfig::default();
assert_eq!(config.dir, PathBuf::from(".cache/fob"));
assert!(!config.force_rebuild);
assert!(config.env_vars.is_empty());
}
#[test]
fn test_cache_config_builder() {
let config = CacheConfig::new("/tmp/cache")
.with_force_rebuild(true)
.with_env_vars(["NODE_ENV", "DEBUG"]);
assert_eq!(config.dir, PathBuf::from("/tmp/cache"));
assert!(config.force_rebuild);
assert_eq!(config.env_vars, vec!["NODE_ENV", "DEBUG"]);
}
}