use std::fmt;
use chrono::{DateTime, NaiveDate, Utc};
use serde::Deserialize;
use serde_json::Value;
#[derive(Clone, Debug, Deserialize)]
pub struct Response {
pub offset: Option<u32>,
pub limit: Option<String>,
pub total_matches: Option<u32>,
pub bugs: Vec<Bug>,
#[serde(flatten)]
pub extra: Value,
}
#[derive(Clone, Debug, Deserialize)]
pub struct BugzillaError {
pub error: bool,
pub message: String,
pub code: i32,
#[serde(flatten)]
pub extra: Value,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(untagged)]
pub enum Component {
One(String),
Many(Vec<String>),
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
#[serde(untagged)]
pub enum Version {
One(String),
Many(Vec<String>),
}
#[allow(clippy::struct_excessive_bools)]
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
pub struct Bug {
pub op_sys: String,
pub classification: String,
pub id: i32,
pub url: String,
pub creator: String,
pub creator_detail: User,
pub summary: String,
pub status: String,
pub estimated_time: Option<i64>,
pub target_milestone: String,
pub cc: Vec<String>,
pub cc_detail: Vec<User>,
pub is_open: bool,
pub is_creator_accessible: bool,
pub docs_contact: Option<String>,
pub docs_contact_detail: Option<User>,
pub assigned_to: String,
pub assigned_to_detail: User,
pub resolution: String,
pub severity: String,
pub product: String,
pub platform: String,
pub last_change_time: DateTime<Utc>,
pub remaining_time: Option<i64>,
pub priority: String,
pub whiteboard: String,
pub creation_time: DateTime<Utc>,
pub is_confirmed: bool,
pub qa_contact: String,
pub qa_contact_detail: Option<User>,
pub dupe_of: Option<i32>,
pub target_release: Option<Version>,
pub actual_time: Option<i64>,
pub component: Component,
pub is_cc_accessible: bool,
pub version: Version,
pub keywords: Vec<String>,
pub depends_on: Vec<i32>,
pub blocks: Vec<i32>,
pub see_also: Option<Vec<String>>,
pub groups: Vec<String>,
pub deadline: Option<NaiveDate>,
pub update_token: Option<String>,
pub work_time: Option<i64>,
pub flags: Option<Vec<Flag>>,
pub tags: Option<Vec<String>>,
pub dependent_products: Option<Vec<String>>,
#[serde(flatten)]
pub extra: Value,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
pub struct User {
pub email: String,
pub id: i32,
pub name: String,
pub real_name: String,
#[serde(flatten)]
pub extra: Value,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Eq)]
pub struct Flag {
pub id: i32,
pub type_id: i32,
pub creation_date: DateTime<Utc>,
pub modification_date: DateTime<Utc>,
pub name: String,
pub status: String,
pub setter: String,
pub requestee: Option<String>,
#[serde(flatten)]
pub extra: Value,
}
impl fmt::Display for Flag {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}: {}", self.name, self.status)
}
}