#![allow(dead_code)]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize)]
pub struct JiraUser {
#[serde(default, rename = "accountId")]
pub account_id: Option<String>,
#[serde(default)]
pub name: Option<String>,
#[serde(default, rename = "displayName")]
pub display_name: Option<String>,
#[serde(default, rename = "emailAddress")]
pub email_address: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraIssue {
pub id: String,
pub key: String,
pub fields: JiraIssueFields,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraIssueFields {
#[serde(default)]
pub summary: Option<String>,
#[serde(default)]
pub description: Option<serde_json::Value>,
#[serde(default)]
pub status: Option<JiraStatus>,
#[serde(default)]
pub priority: Option<JiraPriority>,
#[serde(default)]
pub assignee: Option<JiraUser>,
#[serde(default)]
pub reporter: Option<JiraUser>,
#[serde(default)]
pub labels: Vec<String>,
#[serde(default)]
pub created: Option<String>,
#[serde(default)]
pub updated: Option<String>,
#[serde(default)]
pub issuetype: Option<JiraIssueTypeRef>,
#[serde(default)]
pub parent: Option<Box<JiraIssue>>,
#[serde(default)]
pub subtasks: Vec<JiraIssue>,
#[serde(default)]
pub issuelinks: Vec<JiraIssueLink>,
#[serde(default)]
pub attachment: Vec<JiraAttachment>,
#[serde(flatten, default)]
pub extras: std::collections::HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraIssueTypeRef {
pub name: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraAttachment {
pub id: String,
#[serde(default)]
pub filename: Option<String>,
#[serde(default)]
pub content: Option<String>,
#[serde(default)]
pub size: Option<u64>,
#[serde(default, rename = "mimeType")]
pub mime_type: Option<String>,
#[serde(default)]
pub created: Option<String>,
#[serde(default)]
pub author: Option<JiraUser>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct JiraStatus {
pub name: String,
#[serde(default)]
pub status_category: Option<JiraStatusCategory>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraStatusCategory {
pub key: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraPriority {
pub name: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraIssueLink {
#[serde(default)]
pub id: Option<String>,
#[serde(rename = "type")]
pub link_type: JiraIssueLinkType,
#[serde(default, rename = "inwardIssue")]
pub inward_issue: Option<Box<JiraIssue>>,
#[serde(default, rename = "outwardIssue")]
pub outward_issue: Option<Box<JiraIssue>>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraIssueLinkType {
pub name: String,
#[serde(default)]
pub inward: Option<String>,
#[serde(default)]
pub outward: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraSearchResponse {
pub issues: Vec<JiraIssue>,
#[serde(default, rename = "startAt")]
pub start_at: Option<u32>,
#[serde(default, rename = "maxResults")]
pub max_results: Option<u32>,
#[serde(default)]
pub total: Option<u32>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraCloudSearchResponse {
pub issues: Vec<JiraIssue>,
#[serde(default, rename = "nextPageToken")]
pub next_page_token: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraComment {
pub id: String,
#[serde(default)]
pub body: Option<serde_json::Value>,
#[serde(default)]
pub author: Option<JiraUser>,
#[serde(default)]
pub created: Option<String>,
#[serde(default)]
pub updated: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraCommentsResponse {
pub comments: Vec<JiraComment>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraTransition {
pub id: String,
pub name: String,
pub to: JiraStatus,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraTransitionsResponse {
pub transitions: Vec<JiraTransition>,
}
#[derive(Debug, Clone, Serialize)]
pub struct CreateIssuePayload {
pub fields: CreateIssueFields,
}
#[derive(Debug, Clone, Serialize)]
pub struct CreateIssueFields {
pub project: ProjectKey,
pub summary: String,
pub issuetype: IssueType,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub labels: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub priority: Option<PriorityName>,
#[serde(skip_serializing_if = "Option::is_none")]
pub assignee: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub components: Option<Vec<ComponentRef>>,
#[serde(rename = "fixVersions", skip_serializing_if = "Option::is_none")]
pub fix_versions: Option<Vec<VersionRef>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent: Option<IssueKeyRef>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComponentRef {
pub name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VersionRef {
pub name: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct ProjectKey {
pub key: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct IssueType {
pub name: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct PriorityName {
pub name: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct UpdateIssuePayload {
pub fields: UpdateIssueFields,
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct UpdateIssueFields {
#[serde(skip_serializing_if = "Option::is_none")]
pub summary: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub labels: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub priority: Option<PriorityName>,
#[serde(skip_serializing_if = "Option::is_none")]
pub assignee: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub components: Option<Vec<ComponentRef>>,
#[serde(rename = "fixVersions", skip_serializing_if = "Option::is_none")]
pub fix_versions: Option<Vec<VersionRef>>,
}
#[derive(Debug, Clone, Serialize)]
pub struct TransitionPayload {
pub transition: TransitionId,
}
#[derive(Debug, Clone, Serialize)]
pub struct TransitionId {
pub id: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct CreateIssueResponse {
pub id: String,
pub key: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct AddCommentPayload {
pub body: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JiraField {
pub id: String,
pub name: String,
#[serde(default)]
pub custom: bool,
#[serde(default)]
pub schema: Option<JiraFieldSchema>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JiraFieldSchema {
#[serde(default, rename = "type")]
pub field_type: Option<String>,
#[serde(default)]
pub items: Option<String>,
#[serde(default)]
pub custom: Option<String>,
#[serde(default, rename = "customId")]
pub custom_id: Option<i64>,
#[serde(default)]
pub system: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraIssueTypeStatuses {
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub statuses: Vec<JiraProjectStatus>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct JiraProjectStatus {
pub name: String,
#[serde(default)]
pub id: Option<String>,
#[serde(default)]
pub status_category: Option<JiraStatusCategory>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateIssueLinkPayload {
#[serde(rename = "type")]
pub link_type: IssueLinkTypeName,
pub inward_issue: IssueKeyRef,
pub outward_issue: IssueKeyRef,
}
#[derive(Debug, Clone, Serialize)]
pub struct IssueLinkTypeName {
pub name: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct IssueKeyRef {
pub key: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraStructure {
pub id: u64,
pub name: String,
#[serde(default)]
pub description: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraStructureListResponse {
pub structures: Vec<JiraStructure>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct JiraForestRow {
pub id: u64,
#[serde(default)]
pub item_id: Option<String>,
#[serde(default)]
pub item_type: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct JiraForestResponse {
pub version: u64,
#[serde(default)]
pub rows: Vec<JiraForestRow>,
#[serde(default)]
pub depths: Vec<u32>,
#[serde(default)]
pub total_count: Option<u64>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraForestModifyResponse {
pub version: u64,
#[serde(default)]
pub rows: Vec<JiraForestRow>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct JiraStructureView {
pub id: u64,
pub name: String,
pub structure_id: u64,
#[serde(default)]
pub columns: Vec<JiraStructureViewColumn>,
#[serde(default)]
pub group_by: Option<String>,
#[serde(default)]
pub sort_by: Option<String>,
#[serde(default)]
pub filter: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct JiraStructureViewColumn {
#[serde(default)]
pub id: Option<String>,
#[serde(default)]
pub field: Option<String>,
#[serde(default)]
pub formula: Option<String>,
#[serde(default)]
pub width: Option<u32>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraStructureViewListResponse {
pub views: Vec<JiraStructureView>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct JiraStructureValueEntry {
pub row_id: u64,
#[serde(default)]
pub column_id: Option<String>,
#[serde(default)]
pub value: serde_json::Value,
}
#[derive(Debug, Clone, Deserialize)]
pub struct JiraStructureValuesResponse {
pub values: Vec<JiraStructureValueEntry>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct JiraVersionDto {
pub id: String,
pub name: String,
#[serde(default)]
pub project: Option<String>,
#[serde(default)]
pub project_id: Option<u64>,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub start_date: Option<String>,
#[serde(default)]
pub release_date: Option<String>,
#[serde(default)]
pub released: bool,
#[serde(default)]
pub archived: bool,
#[serde(default)]
pub overdue: Option<bool>,
#[serde(default)]
pub issues_status_for_fix_version: Option<JiraVersionIssueStatusCounts>,
#[serde(default)]
pub issues_unresolved_count: Option<u32>,
}
#[derive(Debug, Clone, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct JiraVersionIssueStatusCounts {
#[serde(default)]
pub unmapped: u32,
#[serde(default)]
pub to_do: u32,
#[serde(default)]
pub in_progress: u32,
#[serde(default)]
pub done: u32,
}
impl JiraVersionIssueStatusCounts {
pub fn total(&self) -> u32 {
self.unmapped
.saturating_add(self.to_do)
.saturating_add(self.in_progress)
.saturating_add(self.done)
}
}
#[derive(Debug, Clone, Serialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct CreateVersionPayload {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub project: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub project_id: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub release_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub released: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub archived: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct UpdateVersionPayload {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub release_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub released: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub archived: Option<bool>,
}