gioser

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…

TOML 815Rust 56Shell 37Markdown 291229 Definiciones

⎇ 8bf1623044075274682e4351a0f8e120047c2bed crates/hammer-core/src/store.rs Rust · 49 líneas · 1.5 KB Historia Quién tocó qué crudo

Scaffold inicial: workspace Rust + SDDs completos 8bf162304 · sergio ·

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}