use failure::Error;
use serde_json;
use action::CommonAction;
use build::ShortBuild;
use client;
use client_internals::Path;
use job::ShortJob;
use Jenkins;
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ShortQueueItem {
pub url: String,
#[serde(flatten)]
pub(crate) other_fields: Option<serde_json::Value>,
}
impl ShortQueueItem {
pub fn get_full_queue_item(&self, jenkins_client: &Jenkins) -> Result<QueueItem, Error> {
let path = jenkins_client.url_to_path(&self.url);
if let Path::QueueItem { .. } = path {
Ok(jenkins_client.get(&path)?.json()?)
} else {
Err(client::Error::InvalidUrl {
url: self.url.clone(),
expected: client::error::ExpectedType::QueueItem,
}.into())
}
}
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct QueueItem {
pub blocked: bool,
pub buildable: bool,
pub cancelled: Option<bool>,
pub id: u32,
pub in_queue_since: u64,
pub params: String,
pub stuck: bool,
pub task: ShortJob,
pub url: String,
pub why: Option<String>,
pub buildable_start_milliseconds: Option<u64>,
pub executable: Option<ShortBuild>,
pub actions: Vec<CommonAction>,
}
impl QueueItem {
pub fn refresh_item(self, jenkins_client: &Jenkins) -> Result<Self, Error> {
let path = jenkins_client.url_to_path(&self.url);
if let Path::QueueItem { .. } = path {
Ok(jenkins_client.get(&path)?.json()?)
} else {
Err(client::Error::InvalidUrl {
url: self.url.clone(),
expected: client::error::ExpectedType::QueueItem,
}.into())
}
}
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Queue {
pub items: Vec<QueueItem>,
}
impl Jenkins {
pub fn get_queue(&self) -> Result<Queue, Error> {
Ok(self.get(&Path::Queue)?.json()?)
}
pub fn get_queue_item(&self, id: i32) -> Result<QueueItem, Error> {
Ok(self.get(&Path::QueueItem { id })?.json()?)
}
}