524e573756
Phase 2 increment 2: - domain: Face, Person, BoundingBox, DetectedFace (512-d embeddings). - ports: FaceAnalyzerPort (detect + embed from raw bytes; decodes internally so the application layer stays image/ML-crate agnostic) and FaceRepository (user-scoped face/person persistence). - DTOs: PersonDto, FaceBoxDto. - NoopFaceAnalyzer — reports is_ready()==false and returns no faces, so the whole People pipeline compiles and runs inert until the operator wires a real ONNX-backed analyzer. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JW6ghFMDtnRYuYNzZhb47M
27 lines
800 B
Rust
27 lines
800 B
Rust
//! Default no-op face analyzer.
|
|
//!
|
|
//! Used when no ML model is configured: it reports `is_ready() == false` and
|
|
//! returns no faces, so the whole People pipeline compiles and runs inert
|
|
//! until a real ONNX-backed analyzer (provided by the operator) replaces it.
|
|
|
|
use async_trait::async_trait;
|
|
|
|
use crate::application::ports::face_ports::FaceAnalyzerPort;
|
|
use crate::common::errors::DomainError;
|
|
use crate::domain::entities::face::DetectedFace;
|
|
|
|
/// Analyzer that never detects anything.
|
|
#[derive(Debug, Default, Clone, Copy)]
|
|
pub struct NoopFaceAnalyzer;
|
|
|
|
#[async_trait]
|
|
impl FaceAnalyzerPort for NoopFaceAnalyzer {
|
|
fn is_ready(&self) -> bool {
|
|
false
|
|
}
|
|
|
|
async fn analyze(&self, _image_bytes: &[u8]) -> Result<Vec<DetectedFace>, DomainError> {
|
|
Ok(Vec::new())
|
|
}
|
|
}
|