use std::time::Duration;
#[derive(Debug, Clone)]
pub struct MemoryConfig {
pub core_memory_bytes: usize,
pub working_memory_bytes: usize,
pub working_memory_ttl: Duration,
pub generate_embeddings: bool,
pub embedding_batch_size: usize,
pub default_recall_limit: usize,
pub semantic_search_enabled: bool,
pub query_expansion_enabled: bool,
}
impl Default for MemoryConfig {
fn default() -> Self {
Self {
core_memory_bytes: 32 * 1024, working_memory_bytes: 1024 * 1024, working_memory_ttl: Duration::from_secs(3600), generate_embeddings: true,
embedding_batch_size: 100,
default_recall_limit: 10,
semantic_search_enabled: true,
query_expansion_enabled: true,
}
}
}
impl MemoryConfig {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn with_core_memory_bytes(mut self, bytes: usize) -> Self {
self.core_memory_bytes = bytes;
self
}
#[must_use]
pub fn with_working_memory_bytes(mut self, bytes: usize) -> Self {
self.working_memory_bytes = bytes;
self
}
#[must_use]
pub fn with_working_memory_ttl(mut self, ttl: Duration) -> Self {
self.working_memory_ttl = ttl;
self
}
#[must_use]
pub fn with_recall_limit(mut self, limit: usize) -> Self {
self.default_recall_limit = limit;
self
}
#[must_use]
pub fn with_embedding_batch_size(mut self, size: usize) -> Self {
self.embedding_batch_size = size;
self
}
#[must_use]
pub fn without_embeddings(mut self) -> Self {
self.generate_embeddings = false;
self
}
#[must_use]
pub fn without_semantic_search(mut self) -> Self {
self.semantic_search_enabled = false;
self
}
#[must_use]
pub fn without_query_expansion(mut self) -> Self {
self.query_expansion_enabled = false;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_values() {
let config = MemoryConfig::default();
assert_eq!(config.core_memory_bytes, 32 * 1024);
assert_eq!(config.working_memory_bytes, 1024 * 1024);
assert_eq!(config.default_recall_limit, 10);
assert_eq!(config.embedding_batch_size, 100);
assert!(config.generate_embeddings);
assert!(config.semantic_search_enabled);
assert!(config.query_expansion_enabled);
}
#[test]
fn test_builder_pattern() {
let config = MemoryConfig::default()
.with_core_memory_bytes(64 * 1024)
.with_recall_limit(20)
.without_embeddings();
assert_eq!(config.core_memory_bytes, 64 * 1024);
assert_eq!(config.default_recall_limit, 20);
assert!(!config.generate_embeddings);
}
#[test]
fn test_method_chaining() {
let config = MemoryConfig::new()
.with_core_memory_bytes(32 * 1024)
.with_working_memory_bytes(2 * 1024 * 1024)
.with_recall_limit(15)
.without_query_expansion();
assert_eq!(config.core_memory_bytes, 32 * 1024);
assert_eq!(config.working_memory_bytes, 2 * 1024 * 1024);
assert_eq!(config.default_recall_limit, 15);
assert!(!config.query_expansion_enabled);
}
}