wekan-cli 2.1.0

Agent-first, human-friendly command-line client for Wekan
Documentation
use crate::client::rules::{RuleDocument, RuleNumber};
use serde::Serialize;

#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct RuleTriggerDetail {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub advanced_filter: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub text_contains: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub cron: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub direction: Option<Option<String>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub activity_type: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub description: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub user_id: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub username: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub list_name: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub old_list_name: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub swimlane_name: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub card_title: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub checklist_name: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub checklist_item_name: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub label_id: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub attachment_name: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub desc: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub schedule_kind: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub schedule_type: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub at_time: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub weekday: Option<Option<RuleNumber>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub day_of_month: Option<Option<RuleNumber>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub on_date: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub due_condition: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub days: Option<Option<RuleNumber>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub last_run_key: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub last_run_at: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub button_type: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub button_label: Option<Option<String>>,
}
impl From<crate::client::rules::RuleTrigger> for RuleTriggerDetail {
    fn from(d: crate::client::rules::RuleTrigger) -> Self {
        Self {
            advanced_filter: d.advanced_filter,
            text_contains: d.text_contains,
            cron: d.cron,
            direction: d.direction,

            activity_type: d.activity_type,
            description: d.description,
            user_id: d.user_id,
            username: d.username,
            list_name: d.list_name,
            old_list_name: d.old_list_name,
            swimlane_name: d.swimlane_name,
            card_title: d.card_title,
            checklist_name: d.checklist_name,
            checklist_item_name: d.checklist_item_name,
            label_id: d.label_id,
            attachment_name: d.attachment_name,
            desc: d.desc,
            schedule_kind: d.schedule_kind,
            schedule_type: d.schedule_type,
            at_time: d.at_time,
            weekday: d.weekday,
            day_of_month: d.day_of_month,
            on_date: d.on_date,
            due_condition: d.due_condition,
            days: d.days,
            last_run_key: d.last_run_key,
            last_run_at: d.last_run_at,
            button_type: d.button_type,
            button_label: d.button_label,
        }
    }
}

#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct RuleActionDetail {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub include_card_details: Option<Option<bool>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub include_checklists_and_comments: Option<Option<bool>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub include_attachments: Option<Option<bool>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub integration_id: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub comment_text: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub list_id: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub swimlane_id: Option<Option<String>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub action_type: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub list_name: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub swimlane_name: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub card_name: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub from_list_name: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub checklist_name: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub check_item_name: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub checklist_items: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub date_field: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub unit: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub email_to: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub email_subject: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub email_msg: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub selected_color: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub label_id: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub username: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub sort_field: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub desc: Option<Option<String>>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub days: Option<Option<RuleNumber>>,
}
impl From<crate::client::rules::RuleAction> for RuleActionDetail {
    fn from(d: crate::client::rules::RuleAction) -> Self {
        Self {
            include_card_details: d.include_card_details,
            include_checklists_and_comments: d.include_checklists_and_comments,
            include_attachments: d.include_attachments,
            integration_id: d.integration_id,
            comment_text: d.comment_text,
            list_id: d.list_id,
            swimlane_id: d.swimlane_id,

            action_type: d.action_type,
            list_name: d.list_name,
            swimlane_name: d.swimlane_name,
            card_name: d.card_name,
            from_list_name: d.from_list_name,
            checklist_name: d.checklist_name,
            check_item_name: d.check_item_name,
            checklist_items: d.checklist_items,
            date_field: d.date_field,
            unit: d.unit,
            email_to: d.email_to,
            email_subject: d.email_subject,
            email_msg: d.email_msg,
            selected_color: d.selected_color,
            label_id: d.label_id,
            username: d.username,
            sort_field: d.sort_field,
            desc: d.desc,
            days: d.days,
        }
    }
}

#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct RuleDetail {
    pub enabled: bool,
    pub extra_triggers: Option<Vec<RuleTriggerDetail>>,
    pub extra_actions: Option<Vec<RuleActionDetail>>,
    pub board_id: String,
    pub rule_id: String,
    pub title: String,
    pub trigger: Option<RuleTriggerDetail>,
    pub action: Option<RuleActionDetail>,
}
impl RuleDetail {
    pub(crate) fn from_document(board_id: String, d: RuleDocument) -> Self {
        Self {
            enabled: d.enabled,
            extra_triggers: d
                .extra_triggers
                .map(|items| items.into_iter().map(Into::into).collect()),
            extra_actions: d
                .extra_actions
                .map(|items| items.into_iter().map(Into::into).collect()),
            board_id,
            rule_id: d.rule_id,
            title: d.title,
            trigger: d.trigger.map(Into::into),
            action: d.action.map(Into::into),
        }
    }
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct RuleCollectionSuccess {
    pub board_id: String,
    pub rules: Vec<RuleDetail>,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct RuleCreateSuccess {
    pub board_id: String,
    pub rule_id: String,
    pub trigger_id: String,
    pub action_id: String,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum RuleSubmittedField {
    Enabled,
    Title,
    Trigger,
    Action,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct RuleUpdateSuccess {
    pub board_id: String,
    pub rule_id: String,
    pub submitted_fields: Vec<RuleSubmittedField>,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct RuleDeleteSuccess {
    pub board_id: String,
    pub rule_id: String,
    pub deleted: bool,
}