use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
pub enum TicketSource {
#[serde(rename = "github")]
GitHub,
#[serde(rename = "linear")]
Linear,
#[serde(rename = "jira")]
Jira,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum TicketState {
Open,
InProgress,
Done,
Closed,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct Ticket {
#[serde(alias = "external_id")]
pub external_id: String,
#[serde(alias = "source")]
pub source: TicketSource,
#[serde(alias = "title")]
pub title: String,
#[serde(alias = "body")]
pub body: String,
#[serde(default, skip_serializing_if = "Vec::is_empty", alias = "labels")]
pub labels: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none", alias = "assignee")]
pub assignee: Option<String>,
#[serde(alias = "url")]
pub url: String,
#[serde(alias = "state")]
pub state: TicketState,
#[serde(alias = "created_at")]
pub created_at: String,
#[serde(alias = "updated_at")]
pub updated_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct TicketComment {
#[serde(alias = "id")]
pub id: String,
#[serde(alias = "author")]
pub author: String,
#[serde(alias = "body")]
pub body: String,
#[serde(alias = "created_at")]
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
#[schemars(deny_unknown_fields)]
pub struct TicketProviderConfig {
#[serde(alias = "source")]
pub source: TicketSource,
#[serde(alias = "api_token")]
pub api_token: String,
#[serde(alias = "target")]
pub target: String,
#[serde(
default,
skip_serializing_if = "Vec::is_empty",
alias = "actionable_labels"
)]
pub actionable_labels: Vec<String>,
#[serde(alias = "workflow_id")]
pub workflow_id: String,
#[serde(default = "default_poll_interval", alias = "poll_interval_seconds")]
pub poll_interval_seconds: u64,
#[serde(default = "default_true", alias = "update_on_completion")]
pub update_on_completion: bool,
}
fn default_poll_interval() -> u64 {
60
}
fn default_true() -> bool {
true
}