sergio/takana
> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…
⎇ 8bf1623044075274682e4351a0f8e120047c2bed
crates/hammer-core/src/store.rs
Historia
Quién tocó qué
crudo
Scaffold inicial: workspace Rust + SDDs completos
1//! El content-addressed store. Ver `docs/03-hydration.md` §1.
2//!
3//! Inmutable, append-only, direccionado por `ArtifactHash`. Esqueleto de Fase 0: la API está
4//! fijada; el sellado real (mover el árbol de salida del sandbox e idealmente hacerlo de sólo
5//! lectura) se completa al implementar el builder.
6
7use std::path::{Path, PathBuf};
8
9use crate::hash::ArtifactHash;
10
11pub struct Store {
12 root: PathBuf,
13}
14
15impl Store {
16 /// Abre (o prepara) un store en `root` (p. ej. `/store`).
17 pub fn open(root: impl Into<PathBuf>) -> crate::Result<Self> {
18 let root = root.into();
19 std::fs::create_dir_all(&root)?;
20 Ok(Store { root })
21 }
22
23 pub fn root(&self) -> &Path {
24 &self.root
25 }
26
27 /// Ruta del artefacto en el store para un hash + nombre legible.
28 pub fn path_of(&self, h: &ArtifactHash, name: &str) -> PathBuf {
29 self.root.join(h.store_dir_name(name))
30 }
31
32 /// ¿Ya existe el artefacto? (caché del lab; ver `docs/02-build-lab.md` §5).
33 pub fn has(&self, h: &ArtifactHash, name: &str) -> bool {
34 self.path_of(h, name).is_dir()
35 }
36
37 /// Sella el árbol de salida de un build en el store bajo su hash.
38 /// TODO(fase-0): mover `out_dir` a la ruta del store y marcarlo read-only.
39 pub fn seal(
40 &self,
41 _out_dir: &Path,
42 _h: &ArtifactHash,
43 _name: &str,
44 ) -> crate::Result<PathBuf> {
45 Err(crate::Error::Store(
46 "sellado en el store pendiente (Fase 0)".into(),
47 ))
48 }
49}