use tracing::warn;
use super::{AzureDevOpsAdapter, GitHubAdapter, JiraAdapter, LinearAdapter, PmAdapter, PmError};
use crate::core::config::Config;
pub(super) fn collect_err_to_pm(
system: &'static str,
e: crate::collect::errors::CollectError,
) -> PmError {
use crate::collect::errors::CollectError;
match e {
CollectError::Http(err) => PmError::Http(err),
CollectError::Json(err) => PmError::Serialization(err),
CollectError::Config(msg) => PmError::Config {
system: system.to_string(),
message: msg,
},
other => PmError::Other {
system: system.to_string(),
message: other.to_string(),
},
}
}
pub(super) fn azdo_err_to_pm(e: crate::collect::azdo::AzdoError) -> PmError {
use crate::collect::azdo::AzdoError;
match e {
AzdoError::Unauthorized => PmError::Auth {
system: "azure_devops".into(),
message: "401 unauthorized".into(),
},
AzdoError::Forbidden => PmError::Auth {
system: "azure_devops".into(),
message: "403 forbidden".into(),
},
AzdoError::InvalidCredentials(msg) => PmError::Auth {
system: "azure_devops".into(),
message: msg,
},
AzdoError::NotFound => PmError::NotFound {
id: "(connection)".into(),
},
AzdoError::Request(err) => PmError::Http(err),
AzdoError::Config(msg) => PmError::Config {
system: "azure_devops".into(),
message: msg,
},
AzdoError::Parse(msg) | AzdoError::InvalidUrl(msg) => PmError::Other {
system: "azure_devops".into(),
message: msg,
},
AzdoError::Http { status, message } => PmError::Other {
system: "azure_devops".into(),
message: format!("HTTP {status}: {message}"),
},
AzdoError::NotImplemented { method, phase } => PmError::Other {
system: "azure_devops".into(),
message: format!("not implemented: {method} (phase {phase})"),
},
}
}
pub fn build_adapters(config: &Config) -> Vec<Box<dyn PmAdapter>> {
let mut out: Vec<Box<dyn PmAdapter>> = Vec::new();
if let Some(cfg) = &config.jira {
match crate::collect::jira::JiraClient::new(cfg) {
Ok(client) => out.push(Box::new(JiraAdapter::with_ticket_regex(
client,
cfg.ticket_regex.as_deref(),
))),
Err(e) => warn!(error = %e, "skipping JIRA adapter: invalid config"),
}
}
if let Some(cfg) = &config.github {
match crate::collect::github::GitHubClient::new(cfg) {
Ok(client) => out.push(Box::new(GitHubAdapter::with_ticket_regex(
client,
cfg.ticket_regex.as_deref(),
))),
Err(e) => warn!(error = %e, "skipping GitHub adapter: invalid config"),
}
}
if let Some(cfg) = &config.linear {
match crate::collect::linear::LinearClient::new(cfg) {
Ok(client) => out.push(Box::new(LinearAdapter::with_ticket_regex(
client,
cfg.ticket_regex.as_deref(),
))),
Err(e) => warn!(error = %e, "skipping Linear adapter: invalid config"),
}
}
if let Some(cfg) = config.azure_devops_config() {
let client = crate::collect::azdo::AzureDevOpsClient::new(cfg.clone());
out.push(Box::new(AzureDevOpsAdapter::new(client)));
}
out
}