use crate::domain::model::record_ref::{DecisionRecordRef, IssueRef};
use crate::domain::usecases::decision_record::{resolve_decision_record, DecisionRecordRepository};
use crate::domain::usecases::issue::{resolve_issue, IssueRepository, Resolved};
use crate::infra::driving::cli::errors::{die1, CliError};
use crate::infra::driving::cli::OutputFormat;
pub(super) fn parse_dr_id(raw: &str, id_prefix: Option<&str>) -> anyhow::Result<DecisionRecordRef> {
if let Ok(r) = raw.parse::<DecisionRecordRef>() {
return Ok(r);
}
if let Ok(n) = raw.parse::<u32>() {
if n > 0 {
let prefix = id_prefix.unwrap_or("ADR-").trim_end_matches('-');
return DecisionRecordRef::new(format!("{prefix}-{n:04}"));
}
}
anyhow::bail!("invalid entity ref '{raw}': not a valid prefixed ID or bare integer")
}
pub(super) fn parse_issue_id(raw: &str, id_prefix: Option<&str>) -> anyhow::Result<IssueRef> {
if let Ok(r) = raw.parse::<IssueRef>() {
return Ok(r);
}
if let Ok(n) = raw.parse::<u32>() {
if n > 0 {
let prefix = id_prefix.unwrap_or("ISSUE-").trim_end_matches('-');
return IssueRef::new(format!("{prefix}-{n:04}"));
}
}
anyhow::bail!("invalid entity ref '{raw}': not a valid prefixed ID or bare integer")
}
pub(super) fn resolve_issue_id(
repo: &dyn IssueRepository,
raw: &str,
id_prefix: Option<&str>,
output_fmt: OutputFormat,
) -> IssueRef {
match resolve_issue(repo, raw) {
Ok(Resolved::Found(issue)) => issue.id,
Ok(Resolved::AmbiguousPrefix { matches }) => {
let suffix = raw.rsplit_once('-').map(|(_, s)| s).unwrap_or(raw);
die1(
CliError::new(format!(
"ambiguous prefix '{}' matches: {}. Disambiguate with a longer prefix.",
suffix,
matches.join(", ")
))
.kind("validation"),
output_fmt,
);
}
Ok(Resolved::NotFound) => parse_issue_id(raw, id_prefix).unwrap_or_else(|e| {
die1(
CliError::new(format!("invalid issue ID '{raw}': {e}")).kind("validation"),
output_fmt,
);
}),
Err(e) => die1(CliError::new(e.to_string()).kind("io"), output_fmt),
}
}
pub(super) fn resolve_dr_id(
repo: &dyn DecisionRecordRepository,
raw: &str,
id_prefix: Option<&str>,
output_fmt: OutputFormat,
) -> DecisionRecordRef {
match resolve_decision_record(repo, raw) {
Ok(Resolved::Found(record)) => record.id,
Ok(Resolved::AmbiguousPrefix { matches }) => {
let suffix = raw.rsplit_once('-').map(|(_, s)| s).unwrap_or(raw);
die1(
CliError::new(format!(
"ambiguous prefix '{}' matches: {}. Disambiguate with a longer prefix.",
suffix,
matches.join(", ")
))
.kind("validation"),
output_fmt,
);
}
Ok(Resolved::NotFound) => parse_dr_id(raw, id_prefix).unwrap_or_else(|e| {
die1(
CliError::new(format!("invalid record ID '{raw}': {e}")).kind("validation"),
output_fmt,
);
}),
Err(e) => die1(CliError::new(e.to_string()).kind("io"), output_fmt),
}
}