pipedash-plugin-komodo 0.9.0

Komodo plugin for Pipedash
Documentation
use serde::Deserialize;

#[derive(Debug, Deserialize)]
pub(crate) struct VersionResponse {
    #[serde(default)]
    pub version: String,
}

#[derive(Debug, Deserialize)]
pub(crate) struct StackListItem {
    pub id: String,
    pub name: String,
    #[serde(default)]
    pub template: bool,
    #[serde(default)]
    pub info: StackInfo,
}

#[derive(Debug, Default, Deserialize)]
pub(crate) struct StackInfo {
    #[serde(default)]
    pub server_id: String,
    #[serde(default)]
    pub server_name: String,
    #[serde(default)]
    pub swarm_name: String,
    #[serde(default)]
    pub repo: String,
    #[serde(default)]
    pub branch: String,
    #[serde(default)]
    pub repo_link: String,
    #[serde(default)]
    pub state: String,
    #[serde(default)]
    pub status: Option<String>,
    #[serde(default)]
    pub services: Vec<StackService>,
    #[serde(default)]
    pub project_missing: bool,
    #[serde(default)]
    pub missing_files: Vec<String>,
    #[serde(default)]
    pub deployed_hash: Option<String>,
    #[serde(default)]
    pub latest_hash: Option<String>,
}

impl StackInfo {
    pub fn host(&self) -> &str {
        [&self.server_name, &self.swarm_name, &self.server_id]
            .into_iter()
            .find(|name| !name.is_empty())
            .map_or("", String::as_str)
    }

    pub fn update_available(&self) -> bool {
        self.services.iter().any(|service| service.update_available)
    }
}

#[derive(Debug, Default, Deserialize)]
pub(crate) struct StackService {
    #[serde(default)]
    pub update_available: bool,
}

#[derive(Debug, Deserialize)]
pub(crate) struct ListUpdatesResponse {
    #[serde(default)]
    pub updates: Vec<UpdateListItem>,
    #[serde(default)]
    pub next_page: Option<u32>,
}

#[derive(Debug, Deserialize)]
pub(crate) struct UpdateListItem {
    #[serde(default)]
    pub id: String,
    #[serde(default)]
    pub operation: String,
    #[serde(default)]
    pub start_ts: i64,
    #[serde(default)]
    pub success: bool,
    #[serde(default)]
    pub username: String,
    #[serde(default)]
    pub operator: String,
    #[serde(default)]
    pub status: String,
    #[serde(default)]
    pub target: UpdateTarget,
}

#[derive(Debug, Default, Deserialize)]
pub(crate) struct UpdateTarget {
    #[serde(default)]
    pub id: String,
}

#[derive(Debug, Deserialize)]
#[serde(untagged)]
pub(crate) enum MongoId {
    Object {
        #[serde(rename = "$oid")]
        oid: String,
    },
    Plain(String),
}

impl MongoId {
    pub fn into_string(self) -> String {
        match self {
            Self::Object { oid } => oid,
            Self::Plain(id) => id,
        }
    }
}

#[derive(Debug, Deserialize)]
pub(crate) struct Update {
    #[serde(default, rename = "_id")]
    pub id: Option<MongoId>,
    #[serde(default)]
    pub start_ts: i64,
    #[serde(default)]
    pub end_ts: Option<i64>,
    #[serde(default)]
    pub success: bool,
    #[serde(default)]
    pub status: String,
    #[serde(default)]
    pub commit_hash: String,
}

#[derive(Debug, Deserialize)]
pub(crate) struct UpdateLogs {
    #[serde(default)]
    pub status: String,
    #[serde(default)]
    pub logs: Vec<UpdateLog>,
}

#[derive(Debug, Deserialize)]
pub(crate) struct UpdateLog {
    #[serde(default)]
    pub stage: String,
    #[serde(default)]
    pub command: String,
    #[serde(default)]
    pub stdout: String,
    #[serde(default)]
    pub stderr: String,
    #[serde(default)]
    pub success: bool,
    #[serde(default)]
    pub start_ts: i64,
    #[serde(default)]
    pub end_ts: i64,
}