Skip to main content

gonzalo_domain/
memory.rs

1//! Memory-tier and auto-memory topic views.
2
3use crate::codec::RecordCodec;
4use gonzalo_core::RecordKind;
5use serde::{Deserialize, Serialize};
6
7/// A CLAUDE.md-style memory tier file.
8#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
9pub struct MemoryTier {
10    pub name: String,
11    pub content: String,
12}
13impl RecordCodec for MemoryTier {}
14impl MemoryTier {
15    pub const KIND: RecordKind = RecordKind::MemoryTier;
16}
17
18/// An auto-memory topic: a slug plus append-only bullet lines.
19#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
20pub struct Topic {
21    pub slug: String,
22    pub bullets: Vec<String>,
23}
24impl RecordCodec for Topic {}
25impl Topic {
26    pub const KIND: RecordKind = RecordKind::Topic;
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32    use crate::codec::RecordCodec;
33
34    #[test]
35    fn tier_roundtrips() {
36        let t = MemoryTier {
37            name: "global".into(),
38            content: "be concise".into(),
39        };
40        assert_eq!(MemoryTier::from_body(&t.to_body().unwrap()).unwrap(), t);
41        assert_eq!(MemoryTier::KIND, RecordKind::MemoryTier);
42    }
43
44    #[test]
45    fn topic_roundtrips() {
46        let t = Topic {
47            slug: "rust".into(),
48            bullets: vec!["use clippy".into()],
49        };
50        assert_eq!(Topic::from_body(&t.to_body().unwrap()).unwrap(), t);
51        assert_eq!(Topic::KIND, RecordKind::Topic);
52    }
53}