chant/repository/
spec_repository.rs1use anyhow::Result;
2
3use crate::spec::{load_all_specs, Spec};
4
5pub trait SpecRepository {
7 fn load(&self, id: &str) -> Result<Spec>;
9
10 fn save(&self, spec: &Spec) -> Result<()>;
12
13 fn list_all(&self) -> Result<Vec<Spec>>;
15}
16
17pub struct FileSpecRepository {
19 specs_dir: std::path::PathBuf,
20}
21
22impl FileSpecRepository {
23 pub fn new(specs_dir: std::path::PathBuf) -> Self {
25 Self { specs_dir }
26 }
27
28 pub fn specs_dir(&self) -> &std::path::Path {
30 &self.specs_dir
31 }
32}
33
34impl SpecRepository for FileSpecRepository {
35 fn load(&self, id: &str) -> Result<Spec> {
36 let spec_path = self.specs_dir.join(format!("{}.md", id));
37 Spec::load(&spec_path)
38 }
39
40 fn save(&self, spec: &Spec) -> Result<()> {
41 let spec_path = self.specs_dir.join(format!("{}.md", spec.id));
42 spec.save(&spec_path)
43 }
44
45 fn list_all(&self) -> Result<Vec<Spec>> {
46 load_all_specs(&self.specs_dir)
47 }
48}