Refactored M3.8 to be extensible and customizable:
SOLID Architecture:
- Single Responsibility: OptimizerPlugin (optimize), FormatHandler (format)
- Open/Closed: Registry trait for extensibility without modification
- Liskov Substitution: Generic SimpleRegistry<T> works for any plugin type
- Interface Segregation: Traits focused, minimal methods
- Dependency Inversion: OptimizerService depends on abstractions
DRY Improvements:
- Generic Registry<T> trait eliminates duplicate register/get/list code
- PluginLocator strategy pattern replaces duplicated lookup logic
- OptimizerServiceBuilder factory pattern for ergonomic creation
Features:
✓ OptimizerPlugin trait (async optimization with metrics)
✓ FormatHandler trait (json, jsonl, raw, csv, yaml)
✓ Registry<T> generic trait (reusable for any plugin type)
✓ PluginLocator strategy (find optimizer by type, format by name)
✓ OptimizerService (orchestrator + dependency injection)
✓ OptimizerServiceBuilder (fluent builder)
✓ BuiltinOptimizer (wraps ContextOptimizer)
✓ 5 format handlers (JSON, JSONL, Raw, CSV, YAML)
Tests (13 passing):
- Registry registration and lookup
- Type-based optimizer finding
- Format handler discovery
- Service creation via builder
- Service optimization workflow
- Error handling on missing formats
Build: ✅ mem-core clean (130 tests total)
Usage:
let service = OptimizerServiceBuilder::new()
.with_optimizer(Arc::new(MyOptimizer))
.with_format(Arc::new(JsonFormatter))
.build()?;
let output = service.optimize(content, "text/plain", Some("json")).await?;
Ready for:
- Custom optimizer implementations
- Custom format handlers
- Query optimization (next commit)
- Ingest pipeline integration (next commit)