wekan-cli 2.0.0

Agent-first, human-friendly command-line client for Wekan
Documentation
use serde::Serialize;

#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct BulkCardCreateItem {
    pub index: usize,
    pub card_id: Option<String>,
    pub error: Option<String>,
}

#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct BulkCardCreateResult {
    pub board_id: String,
    pub list_id: String,
    pub results: Vec<BulkCardCreateItem>,
}

#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct BulkCardDeleteResult {
    pub board_id: String,
    pub deleted: Vec<String>,
    pub not_found: Vec<String>,
}

#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct BulkCardLabelUpdate {
    pub card_id: String,
    pub label_ids: Vec<Option<String>>,
}

#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct BulkCardLabelsResult {
    pub board_id: String,
    pub updated: Vec<BulkCardLabelUpdate>,
    pub not_found: Vec<String>,
}

#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
#[serde(tag = "operation", content = "data", rename_all = "snake_case")]
pub enum CardBatchResult {
    CardBulkCreate(BulkCardCreateResult),
    CardBulkDelete(BulkCardDeleteResult),
    CardBulkLabels(BulkCardLabelsResult),
}

impl CardBatchResult {
    pub fn incomplete(&self) -> bool {
        match self {
            Self::CardBulkCreate(data) => data.results.iter().any(|item| item.error.is_some()),
            Self::CardBulkDelete(data) => !data.not_found.is_empty(),
            Self::CardBulkLabels(data) => !data.not_found.is_empty(),
        }
    }
}