pipedash-plugin-azure-devops 0.8.0

Azure DevOps Pipelines plugin for Pipedash
Documentation
use std::collections::BTreeMap;

use chrono::{
    DateTime,
    Utc,
};
use serde::Deserialize;

#[derive(Debug, Deserialize)]
pub(crate) struct ListResponse<T> {
    #[serde(default = "Vec::new")]
    pub value: Vec<T>,
}

#[derive(Debug, Deserialize)]
pub(crate) struct Project {
    pub name: String,
    #[serde(default)]
    pub description: Option<String>,
}

#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct Identity {
    #[serde(default)]
    pub display_name: Option<String>,
}

#[derive(Debug, Deserialize)]
pub(crate) struct Link {
    #[serde(default)]
    pub href: Option<String>,
}

#[derive(Debug, Deserialize)]
pub(crate) struct Links {
    #[serde(default)]
    pub web: Option<Link>,
}

#[derive(Debug, Deserialize)]
pub(crate) struct DefinitionRef {
    #[serde(default)]
    pub id: Option<i64>,
}

#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct Build {
    pub id: i64,
    #[serde(default)]
    pub build_number: Option<String>,
    #[serde(default)]
    pub status: Option<String>,
    #[serde(default)]
    pub result: Option<String>,
    #[serde(default)]
    pub source_branch: Option<String>,
    #[serde(default)]
    pub source_version: Option<String>,
    #[serde(default)]
    pub queue_time: Option<DateTime<Utc>>,
    #[serde(default)]
    pub start_time: Option<DateTime<Utc>>,
    #[serde(default)]
    pub finish_time: Option<DateTime<Utc>>,
    #[serde(default)]
    pub requested_for: Option<Identity>,
    #[serde(default)]
    pub parameters: Option<String>,
    #[serde(default)]
    pub definition: Option<DefinitionRef>,
    #[serde(default, rename = "_links")]
    pub links: Option<Links>,
}

impl Build {
    pub fn web_link(&self) -> Option<&str> {
        self.links
            .as_ref()
            .and_then(|links| links.web.as_ref())
            .and_then(|web| web.href.as_deref())
            .filter(|href| !href.is_empty())
    }
}

#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct Definition {
    pub id: i64,
    pub name: String,
    #[serde(default)]
    pub latest_build: Option<Build>,
}

#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct Repository {
    #[serde(default)]
    pub default_branch: Option<String>,
}

#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct Variable {
    #[serde(default)]
    pub value: Option<String>,
    #[serde(default)]
    pub allow_override: bool,
    #[serde(default)]
    pub is_secret: bool,
}

impl Variable {
    pub fn is_overridable(&self) -> bool {
        self.allow_override && !self.is_secret
    }
}

#[derive(Debug, Deserialize)]
pub(crate) struct DefinitionDetail {
    #[serde(default)]
    pub repository: Option<Repository>,
    #[serde(default)]
    pub variables: Option<BTreeMap<String, Variable>>,
}

#[derive(Debug, Deserialize)]
pub(crate) struct LogRef {
    pub id: i64,
}

#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct TimelineRecord {
    pub id: String,
    #[serde(default)]
    pub parent_id: Option<String>,
    #[serde(default, rename = "type")]
    pub kind: Option<String>,
    #[serde(default)]
    pub name: Option<String>,
    #[serde(default)]
    pub state: Option<String>,
    #[serde(default)]
    pub result: Option<String>,
    #[serde(default)]
    pub start_time: Option<DateTime<Utc>>,
    #[serde(default)]
    pub finish_time: Option<DateTime<Utc>>,
    #[serde(default)]
    pub order: Option<i64>,
    #[serde(default)]
    pub attempt: Option<i64>,
    #[serde(default)]
    pub log: Option<LogRef>,
}

#[derive(Debug, Deserialize)]
pub(crate) struct Timeline {
    #[serde(default)]
    pub records: Vec<TimelineRecord>,
}