use super::{Change, ChangeSummary};
use crate::errors::DomainResult;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ChangeLifecycleFilter {
#[default]
Active,
Archived,
All,
}
impl ChangeLifecycleFilter {
pub fn includes_active(self) -> bool {
matches!(
self,
ChangeLifecycleFilter::Active | ChangeLifecycleFilter::All
)
}
pub fn includes_archived(self) -> bool {
matches!(
self,
ChangeLifecycleFilter::Archived | ChangeLifecycleFilter::All
)
}
pub fn as_str(self) -> &'static str {
match self {
ChangeLifecycleFilter::Active => "active",
ChangeLifecycleFilter::Archived => "archived",
ChangeLifecycleFilter::All => "all",
}
}
pub fn parse(value: &str) -> Option<Self> {
match value.trim().to_lowercase().as_str() {
"active" => Some(ChangeLifecycleFilter::Active),
"archived" => Some(ChangeLifecycleFilter::Archived),
"all" => Some(ChangeLifecycleFilter::All),
_ => None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ChangeTargetResolution {
Unique(String),
Ambiguous(Vec<String>),
NotFound,
}
#[derive(Debug, Clone, Copy, Default)]
pub struct ResolveTargetOptions {
pub lifecycle: ChangeLifecycleFilter,
}
pub trait ChangeRepository {
fn resolve_target(&self, input: &str) -> ChangeTargetResolution {
self.resolve_target_with_options(input, ResolveTargetOptions::default())
}
fn resolve_target_with_options(
&self,
input: &str,
options: ResolveTargetOptions,
) -> ChangeTargetResolution;
fn suggest_targets(&self, input: &str, max: usize) -> Vec<String>;
fn exists(&self, id: &str) -> bool;
fn exists_with_filter(&self, id: &str, filter: ChangeLifecycleFilter) -> bool;
fn get(&self, id: &str) -> DomainResult<Change> {
self.get_with_filter(id, ChangeLifecycleFilter::Active)
}
fn get_with_filter(&self, id: &str, filter: ChangeLifecycleFilter) -> DomainResult<Change>;
fn list(&self) -> DomainResult<Vec<ChangeSummary>> {
self.list_with_filter(ChangeLifecycleFilter::Active)
}
fn list_with_filter(&self, filter: ChangeLifecycleFilter) -> DomainResult<Vec<ChangeSummary>>;
fn list_by_module(&self, module_id: &str) -> DomainResult<Vec<ChangeSummary>> {
self.list_by_module_with_filter(module_id, ChangeLifecycleFilter::Active)
}
fn list_by_module_with_filter(
&self,
module_id: &str,
filter: ChangeLifecycleFilter,
) -> DomainResult<Vec<ChangeSummary>>;
fn list_incomplete(&self) -> DomainResult<Vec<ChangeSummary>> {
self.list_incomplete_with_filter(ChangeLifecycleFilter::Active)
}
fn list_incomplete_with_filter(
&self,
filter: ChangeLifecycleFilter,
) -> DomainResult<Vec<ChangeSummary>>;
fn list_complete(&self) -> DomainResult<Vec<ChangeSummary>> {
self.list_complete_with_filter(ChangeLifecycleFilter::Active)
}
fn list_complete_with_filter(
&self,
filter: ChangeLifecycleFilter,
) -> DomainResult<Vec<ChangeSummary>>;
fn get_summary(&self, id: &str) -> DomainResult<ChangeSummary> {
self.get_summary_with_filter(id, ChangeLifecycleFilter::Active)
}
fn get_summary_with_filter(
&self,
id: &str,
filter: ChangeLifecycleFilter,
) -> DomainResult<ChangeSummary>;
}