ito_domain/changes/
repository.rs1use super::{Change, ChangeSummary};
4use crate::errors::DomainResult;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
8pub enum ChangeLifecycleFilter {
9 #[default]
11 Active,
12 Archived,
14 All,
16}
17
18impl ChangeLifecycleFilter {
19 pub fn includes_active(self) -> bool {
21 matches!(
22 self,
23 ChangeLifecycleFilter::Active | ChangeLifecycleFilter::All
24 )
25 }
26
27 pub fn includes_archived(self) -> bool {
29 matches!(
30 self,
31 ChangeLifecycleFilter::Archived | ChangeLifecycleFilter::All
32 )
33 }
34
35 pub fn as_str(self) -> &'static str {
37 match self {
38 ChangeLifecycleFilter::Active => "active",
39 ChangeLifecycleFilter::Archived => "archived",
40 ChangeLifecycleFilter::All => "all",
41 }
42 }
43
44 pub fn parse(value: &str) -> Option<Self> {
46 match value.trim().to_lowercase().as_str() {
47 "active" => Some(ChangeLifecycleFilter::Active),
48 "archived" => Some(ChangeLifecycleFilter::Archived),
49 "all" => Some(ChangeLifecycleFilter::All),
50 _ => None,
51 }
52 }
53}
54
55#[derive(Debug, Clone, PartialEq, Eq)]
57pub enum ChangeTargetResolution {
58 Unique(String),
60 Ambiguous(Vec<String>),
62 NotFound,
64}
65
66#[derive(Debug, Clone, Copy, Default)]
68pub struct ResolveTargetOptions {
69 pub lifecycle: ChangeLifecycleFilter,
71}
72
73pub trait ChangeRepository {
78 fn resolve_target(&self, input: &str) -> ChangeTargetResolution {
80 self.resolve_target_with_options(input, ResolveTargetOptions::default())
81 }
82
83 fn resolve_target_with_options(
85 &self,
86 input: &str,
87 options: ResolveTargetOptions,
88 ) -> ChangeTargetResolution;
89
90 fn suggest_targets(&self, input: &str, max: usize) -> Vec<String>;
92
93 fn exists(&self, id: &str) -> bool;
95
96 fn exists_with_filter(&self, id: &str, filter: ChangeLifecycleFilter) -> bool;
98
99 fn get(&self, id: &str) -> DomainResult<Change> {
101 self.get_with_filter(id, ChangeLifecycleFilter::Active)
102 }
103
104 fn get_with_filter(&self, id: &str, filter: ChangeLifecycleFilter) -> DomainResult<Change>;
106
107 fn list(&self) -> DomainResult<Vec<ChangeSummary>> {
109 self.list_with_filter(ChangeLifecycleFilter::Active)
110 }
111
112 fn list_with_filter(&self, filter: ChangeLifecycleFilter) -> DomainResult<Vec<ChangeSummary>>;
114
115 fn list_by_module(&self, module_id: &str) -> DomainResult<Vec<ChangeSummary>> {
117 self.list_by_module_with_filter(module_id, ChangeLifecycleFilter::Active)
118 }
119
120 fn list_by_module_with_filter(
122 &self,
123 module_id: &str,
124 filter: ChangeLifecycleFilter,
125 ) -> DomainResult<Vec<ChangeSummary>>;
126
127 fn list_incomplete(&self) -> DomainResult<Vec<ChangeSummary>> {
129 self.list_incomplete_with_filter(ChangeLifecycleFilter::Active)
130 }
131
132 fn list_incomplete_with_filter(
134 &self,
135 filter: ChangeLifecycleFilter,
136 ) -> DomainResult<Vec<ChangeSummary>>;
137
138 fn list_complete(&self) -> DomainResult<Vec<ChangeSummary>> {
140 self.list_complete_with_filter(ChangeLifecycleFilter::Active)
141 }
142
143 fn list_complete_with_filter(
145 &self,
146 filter: ChangeLifecycleFilter,
147 ) -> DomainResult<Vec<ChangeSummary>>;
148
149 fn get_summary(&self, id: &str) -> DomainResult<ChangeSummary> {
151 self.get_summary_with_filter(id, ChangeLifecycleFilter::Active)
152 }
153
154 fn get_summary_with_filter(
156 &self,
157 id: &str,
158 filter: ChangeLifecycleFilter,
159 ) -> DomainResult<ChangeSummary>;
160}