use serde::ser::SerializeStruct;
use serde::{Serialize, Serializer};
use super::azdo::AzureDevOpsConfig;
use super::credential_debug::{mask, mask_required};
use super::{BitbucketConfig, ClassificationConfig, GithubConfig, JiraConfig, LinearConfig};
impl Serialize for LinearConfig {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let Self {
api_key,
team_keys,
fetch_on_reference,
ticket_regex,
} = self;
let mut s = serializer.serialize_struct("LinearConfig", 4)?;
s.serialize_field("api_key", &mask(api_key.as_ref()))?;
s.serialize_field("team_keys", team_keys)?;
s.serialize_field("fetch_on_reference", fetch_on_reference)?;
s.serialize_field("ticket_regex", ticket_regex)?;
s.end()
}
}
impl Serialize for GithubConfig {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let Self {
token,
org,
orgs,
repo,
fetch_prs,
fetch_pr_reviews,
review_fetch_concurrency,
ticket_regex,
fetch_on_reference,
work_items_unavailable,
} = self;
let mut s = serializer.serialize_struct("GithubConfig", 10)?;
s.serialize_field("token", &mask(token.as_ref()))?;
s.serialize_field("org", org)?;
s.serialize_field("orgs", orgs)?;
s.serialize_field("repo", repo)?;
s.serialize_field("fetch_prs", fetch_prs)?;
s.serialize_field("fetch_pr_reviews", fetch_pr_reviews)?;
s.serialize_field("review_fetch_concurrency", review_fetch_concurrency)?;
s.serialize_field("ticket_regex", ticket_regex)?;
s.serialize_field("fetch_on_reference", fetch_on_reference)?;
s.serialize_field("work_items_unavailable", work_items_unavailable)?;
s.end()
}
}
impl Serialize for BitbucketConfig {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let Self {
username,
app_password,
token,
workspace,
repo_slug,
fetch_prs,
api_base_url,
} = self;
let mut s = serializer.serialize_struct("BitbucketConfig", 7)?;
s.serialize_field("username", username)?;
s.serialize_field("app_password", &mask(app_password.as_ref()))?;
s.serialize_field("token", &mask(token.as_ref()))?;
s.serialize_field("workspace", workspace)?;
s.serialize_field("repo_slug", repo_slug)?;
s.serialize_field("fetch_prs", fetch_prs)?;
s.serialize_field("api_base_url", api_base_url)?;
s.end()
}
}
impl Serialize for JiraConfig {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let Self {
url,
username,
token,
project_key,
timezone,
jira_project_mappings,
jira_project_mapping_confidence,
ticket_regex,
fetch_on_reference,
} = self;
let mut s = serializer.serialize_struct("JiraConfig", 9)?;
s.serialize_field("url", url)?;
s.serialize_field("username", username)?;
s.serialize_field("token", &mask(token.as_ref()))?;
s.serialize_field("project_key", project_key)?;
s.serialize_field("timezone", timezone)?;
s.serialize_field("jira_project_mappings", jira_project_mappings)?;
s.serialize_field(
"jira_project_mapping_confidence",
jira_project_mapping_confidence,
)?;
s.serialize_field("ticket_regex", ticket_regex)?;
s.serialize_field("fetch_on_reference", fetch_on_reference)?;
s.end()
}
}
impl Serialize for AzureDevOpsConfig {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let Self {
organization_url,
pat,
project,
projects,
ticket_regex,
team_keys,
fetch_on_reference,
fetch_prs,
} = self;
let mut s = serializer.serialize_struct("AzureDevOpsConfig", 8)?;
s.serialize_field("organization_url", organization_url)?;
s.serialize_field("pat", mask_required(pat))?;
s.serialize_field("project", project)?;
s.serialize_field("projects", projects)?;
s.serialize_field("ticket_regex", ticket_regex)?;
s.serialize_field("team_keys", team_keys)?;
s.serialize_field("fetch_on_reference", fetch_on_reference)?;
s.serialize_field("fetch_prs", fetch_prs)?;
s.end()
}
}
impl Serialize for ClassificationConfig {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let Self {
rules_files,
repo_categories,
use_llm,
llm_model,
llm_provider,
openrouter_api_key,
confidence_threshold,
custom_categories,
min_coverage_pct,
llm_fallback_threshold,
weighted_sum,
llm_fallback_concurrency,
no_external,
checkpoint_every,
sources,
} = self;
let mut s = serializer.serialize_struct("ClassificationConfig", 15)?;
s.serialize_field("rules_files", rules_files)?;
s.serialize_field("repo_categories", repo_categories)?;
s.serialize_field("use_llm", use_llm)?;
s.serialize_field("llm_model", llm_model)?;
s.serialize_field("llm_provider", llm_provider)?;
s.serialize_field("openrouter_api_key", &mask(openrouter_api_key.as_ref()))?;
s.serialize_field("confidence_threshold", confidence_threshold)?;
s.serialize_field("custom_categories", custom_categories)?;
s.serialize_field("min_coverage_pct", min_coverage_pct)?;
s.serialize_field("llm_fallback_threshold", llm_fallback_threshold)?;
s.serialize_field("weighted_sum", weighted_sum)?;
s.serialize_field("llm_fallback_concurrency", llm_fallback_concurrency)?;
s.serialize_field("no_external", no_external)?;
s.serialize_field("checkpoint_every", checkpoint_every)?;
s.serialize_field("sources", sources)?;
s.end()
}
}