//! El content-addressed store. Ver `docs/03-hydration.md` §1. //! //! Inmutable, append-only, direccionado por `ArtifactHash`. Esqueleto de Fase 0: la API está //! fijada; el sellado real (mover el árbol de salida del sandbox e idealmente hacerlo de sólo //! lectura) se completa al implementar el builder. use std::path::{Path, PathBuf}; use crate::hash::ArtifactHash; pub struct Store { root: PathBuf, } impl Store { /// Abre (o prepara) un store en `root` (p. ej. `/store`). pub fn open(root: impl Into) -> crate::Result { let root = root.into(); std::fs::create_dir_all(&root)?; Ok(Store { root }) } pub fn root(&self) -> &Path { &self.root } /// Ruta del artefacto en el store para un hash + nombre legible. pub fn path_of(&self, h: &ArtifactHash, name: &str) -> PathBuf { self.root.join(h.store_dir_name(name)) } /// ¿Ya existe el artefacto? (caché del lab; ver `docs/02-build-lab.md` §5). pub fn has(&self, h: &ArtifactHash, name: &str) -> bool { self.path_of(h, name).is_dir() } /// Sella el árbol de salida de un build en el store bajo su hash. /// TODO(fase-0): mover `out_dir` a la ruta del store y marcarlo read-only. pub fn seal( &self, _out_dir: &Path, _h: &ArtifactHash, _name: &str, ) -> crate::Result { Err(crate::Error::Store( "sellado en el store pendiente (Fase 0)".into(), )) } }