use anyhow::Result;
use super::unified_extraction::UnifiedExtractionResult;
use super::pattern_registry::PatternRegistry;
pub struct UnifiedRegistry {
pattern_registry: PatternRegistry,
}
impl Default for UnifiedRegistry {
fn default() -> Self {
Self::new()
}
}
impl UnifiedRegistry {
pub fn new() -> Self {
Self {
pattern_registry: PatternRegistry::new(),
}
}
pub fn from_pattern_registry(pattern_registry: PatternRegistry) -> Self {
Self {
pattern_registry,
}
}
pub fn load_or_default() -> Result<Self> {
let pattern_registry = PatternRegistry::from_default_file()?;
Ok(Self {
pattern_registry,
})
}
pub fn learn_from_extraction(&mut self, result: &UnifiedExtractionResult, _session_id: &str) {
if !result.conversation_patterns.is_empty() {
self.pattern_registry.learn_patterns(&result.conversation_patterns);
}
}
pub fn save_all(&self) -> Result<()> {
self.pattern_registry.save_to_default_file()?;
Ok(())
}
pub fn pattern_registry(&self) -> &PatternRegistry {
&self.pattern_registry
}
pub fn pattern_registry_mut(&mut self) -> &mut PatternRegistry {
&mut self.pattern_registry
}
pub fn prune(&mut self) {
self.pattern_registry.prune();
}
pub fn stats(&self) -> UnifiedRegistryStats {
let pattern_stats = self.pattern_registry.stats();
UnifiedRegistryStats {
total_patterns: pattern_stats.total,
active_patterns: pattern_stats.active,
}
}
}
#[derive(Debug, Clone)]
pub struct UnifiedRegistryStats {
pub total_patterns: usize,
pub active_patterns: usize,
}
impl std::fmt::Display for UnifiedRegistryStats {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
writeln!(
f,
"Unified Registry Stats:"
)?;
writeln!(
f,
" Patterns: {} (active: {})",
self.total_patterns, self.active_patterns
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_unified_registry_new() {
let registry = UnifiedRegistry::new();
assert!(registry.pattern_registry().is_empty());
}
#[test]
fn test_unified_registry_default() {
let registry = UnifiedRegistry::default();
assert!(registry.pattern_registry().is_empty());
}
#[test]
fn test_unified_registry_stats() {
let registry = UnifiedRegistry::new();
let stats = registry.stats();
assert_eq!(stats.total_patterns, 0);
}
#[test]
fn test_unified_registry_stats_display() {
let registry = UnifiedRegistry::new();
let stats = registry.stats();
let display = format!("{}", stats);
assert!(display.contains("Unified Registry Stats"));
assert!(display.contains("Patterns:"));
}
#[test]
fn test_unified_registry_prune() {
let mut registry = UnifiedRegistry::new();
registry.pattern_registry_mut().add_pattern(
crate::memory::ConversationPattern::manual(
crate::memory::PatternType::Code,
"test-pattern",
),
);
registry.prune();
assert!(!registry.pattern_registry().is_empty());
}
#[test]
fn test_unified_registry_mut_accessors() {
let mut registry = UnifiedRegistry::new();
let patterns = registry.pattern_registry_mut();
assert!(patterns.is_empty());
registry.pattern_registry_mut().add_pattern(
crate::memory::ConversationPattern::manual(
crate::memory::PatternType::Code,
"test-pattern",
),
);
assert!(!registry.pattern_registry().is_empty());
}
}