use std::collections::HashMap;
use super::comparison::VersionComparison;
use super::error::Result;
use super::policy::{PolicyCheckResult, PromotionPolicy};
use super::stage::ModelStage;
use super::transition::StageTransition;
use super::version::ModelVersion;
pub trait ModelRegistry: Send + Sync {
fn register_model(&mut self, name: &str, artifact_uri: &str) -> Result<ModelVersion>;
fn get_model(&self, name: &str, version: u32) -> Result<ModelVersion>;
fn get_latest(&self, name: &str) -> Result<ModelVersion>;
fn get_latest_by_stage(&self, name: &str, stage: ModelStage) -> Option<ModelVersion>;
fn list_versions(&self, name: &str) -> Result<Vec<ModelVersion>>;
fn transition_stage(
&mut self,
name: &str,
version: u32,
target_stage: ModelStage,
user: Option<&str>,
) -> Result<()>;
fn compare_versions(&self, name: &str, v1: u32, v2: u32) -> Result<VersionComparison>;
fn log_metrics(
&mut self,
name: &str,
version: u32,
metrics: HashMap<String, f64>,
) -> Result<()>;
fn get_transition_history(&self, name: &str) -> Result<Vec<StageTransition>>;
fn set_policy(&mut self, policy: PromotionPolicy);
fn get_policy(&self, stage: ModelStage) -> Option<&PromotionPolicy>;
fn can_promote(
&self,
name: &str,
version: u32,
target_stage: ModelStage,
approvals: u32,
) -> Result<PolicyCheckResult>;
}