//! !!! DO NOT EDIT THIS FILE !!!
//!
//! This file is auto-generated by './generate-schema.sh' in the repository.
//! Please refer to the script code to learn how to update the source data.

#![allow(clippy::enum_variant_names)]
#![allow(clippy::missing_docs_in_private_items)]
#![allow(missing_docs)]
#![allow(non_snake_case)]

// Example code that deserializes and serializes the model.
// extern crate serde;
// #[macro_use]
// extern crate serde_derive;
// extern crate serde_json;
//
// use generated_module::FilesUploadResponse;
//
// fn main() {
//     let json = r#"{"answer": 42}"#;
//     let model: FilesUploadResponse = serde_json::from_str(&json).unwrap();
// }

use serde::{Deserialize, Serialize};
use std::collections::HashMap;

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FilesUploadResponse {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub error: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub file: Option<File>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub needed: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub ok: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub provided: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct File {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub access: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub alt_txt: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub app_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub app_name: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub bot_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub can_toggle_canvas_lock: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub canvas_template_mode: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub cc: Option<Vec<Cc>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub channel_actions_count: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub channel_actions_ts: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub channels: Option<Vec<String>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub comments_count: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub converted_pdf: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub created: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub deanimate: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub deanimate_gif: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub display_as_bot: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub dm_mpdm_users_with_file_access: Option<Vec<DmMpdmUsersWithFileAccess>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub duration_ms: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub edit_link: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub edit_timestamp: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub editable: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub editor: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub editors: Option<Vec<String>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub external_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub external_type: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub external_url: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub favorites: Option<Vec<Favorite>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub file_access: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub filetype: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub from: Option<Vec<Cc>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub groups: Option<Vec<String>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub has_more: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub has_more_shares: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub has_rich_preview: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub headers: Option<Headers>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub hls: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub hls_embed: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub image_exif_rotation: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub ims: Option<Vec<String>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub initial_comment: Option<InitialComment>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub is_channel_space: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub is_external: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub is_public: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub is_starred: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub last_editor: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub last_read: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub lines: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub lines_more: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub linked_channel_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub list_limits: Option<ListLimits>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub list_metadata: Option<ListMetadata>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub media_display_type: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub media_progress: Option<MediaProgress>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub mimetype: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub mode: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub mp4: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub mp4_low: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub non_owner_editable: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub num_stars: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub org_or_workspace_access: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub original_attachment_count: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub original_h: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub original_w: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub permalink: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub permalink_public: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub pinned_to: Option<Vec<String>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub pjpeg: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub plain_text: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub pretty_type: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub preview: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub preview_highlight: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub preview_is_truncated: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub preview_plain_text: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub private_channels_with_file_access_count: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub private_file_with_access_count: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub public_url_shared: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub quip_thread_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub reactions: Option<Vec<Reaction>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub saved: Option<Saved>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub sent_to_self: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub shares: Option<Shares>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub show_badge: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub simplified_html: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub size: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub source_team: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub subject: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub subtype: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub team_pref_version_history_enabled: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub teams_shared_with: Option<Vec<Option<serde_json::Value>>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub template_conversion_ts: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub template_description: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub template_icon: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub template_name: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub template_title: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_1024: Option<String>,

    #[serde(rename = "thumb_1024_gif")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_1024__gif: Option<String>,

    #[serde(rename = "thumb_1024_h")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_1024__h: Option<String>,

    #[serde(rename = "thumb_1024_w")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_1024__w: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_160: Option<String>,

    #[serde(rename = "thumb_160_gif")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_160__gif: Option<String>,

    #[serde(rename = "thumb_160_h")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_160__h: Option<String>,

    #[serde(rename = "thumb_160_w")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_160__w: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_360: Option<String>,

    #[serde(rename = "thumb_360_gif")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_360__gif: Option<String>,

    #[serde(rename = "thumb_360_h")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_360__h: Option<String>,

    #[serde(rename = "thumb_360_w")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_360__w: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_480: Option<String>,

    #[serde(rename = "thumb_480_gif")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_480__gif: Option<String>,

    #[serde(rename = "thumb_480_h")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_480__h: Option<String>,

    #[serde(rename = "thumb_480_w")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_480__w: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_64: Option<String>,

    #[serde(rename = "thumb_64_gif")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_64__gif: Option<String>,

    #[serde(rename = "thumb_64_h")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_64__h: Option<String>,

    #[serde(rename = "thumb_64_w")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_64__w: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_720: Option<String>,

    #[serde(rename = "thumb_720_gif")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_720__gif: Option<String>,

    #[serde(rename = "thumb_720_h")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_720__h: Option<String>,

    #[serde(rename = "thumb_720_w")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_720__w: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_80: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_800: Option<String>,

    #[serde(rename = "thumb_800_gif")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_800__gif: Option<String>,

    #[serde(rename = "thumb_800_h")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_800__h: Option<String>,

    #[serde(rename = "thumb_800_w")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_800__w: Option<String>,

    #[serde(rename = "thumb_80_gif")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_80__gif: Option<String>,

    #[serde(rename = "thumb_80_h")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_80__h: Option<String>,

    #[serde(rename = "thumb_80_w")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_80__w: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_960: Option<String>,

    #[serde(rename = "thumb_960_gif")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_960__gif: Option<String>,

    #[serde(rename = "thumb_960_h")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_960__h: Option<String>,

    #[serde(rename = "thumb_960_w")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_960__w: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_gif: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_pdf: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_pdf_h: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_pdf_w: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_tiny: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_video: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_video_h: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumb_video_w: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub timestamp: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub title: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub title_blocks: Option<Vec<TitleBlock>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub to: Option<Vec<Cc>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub transcription: Option<Transcription>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub update_notification: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub updated: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub url_private: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub url_private_download: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub url_static_preview: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub user: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub user_team: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub username: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub vtt: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Cc {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub address: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub original: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DmMpdmUsersWithFileAccess {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub access: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub user_id: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Favorite {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub collection_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub collection_name: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub position: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Headers {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub date: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub in_reply_to: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub message_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub reply_to: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InitialComment {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub channel: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub comment: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub created: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub is_intro: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub timestamp: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub user: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListLimits {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub column_count: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub column_count_limit: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub over_column_maximum: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub over_row_maximum: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub over_view_maximum: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub row_count: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub row_count_limit: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub view_count: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub view_count_limit: Option<i64>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListMetadata {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub creation_source: Option<CreationSource>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub description: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub icon: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub icon_team_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub icon_url: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub integrations: Option<Vec<String>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub is_trial: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub schema: Option<Vec<Schema>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub views: Option<Vec<View>>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreationSource {
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub creation_source_type: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub reference_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub workflow_function_id: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Schema {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub is_primary_column: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub key: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub options: Option<Options>,

    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub schema_type: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Options {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub canvas_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub canvas_placeholder_mapping: Option<Vec<CanvasPlaceholderMapping>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub choices: Option<Vec<Choice>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub currency: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub currency_format: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub date_format: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub default_value: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub default_value_typed: Option<DefaultValueTyped>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub emoji: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub emoji_team_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub for_assignment: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub format: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub linked_to: Option<Vec<String>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub mark_as_done_when_checked: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub max: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub notify_users: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub precision: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub rounding: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub show_member_name: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub time_format: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CanvasPlaceholderMapping {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub column: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub variable: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Choice {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub color: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub label: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub value: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DefaultValueTyped {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub select: Option<Vec<String>>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct View {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub columns: Option<Vec<Column>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub created_by: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub date_created: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub is_all_items_view: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub is_locked: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub position: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub stick_column_left: Option<bool>,

    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub view_type: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Column {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub key: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub position: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub visible: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub width: Option<i64>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MediaProgress {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub duration_ms: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub max_offset_ms: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub offset_ms: Option<i64>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Reaction {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub count: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub url: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub users: Option<Vec<String>>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Saved {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub date_completed: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub date_due: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub is_archived: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub state: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Shares {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub private: Option<HashMap<String, Vec<Private>>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub public: Option<HashMap<String, Vec<Private>>>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Private {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub access: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub channel_name: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub date_last_shared: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub latest_reply: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub reply_count: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub reply_users: Option<Vec<String>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub reply_users_count: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub share_user_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub source: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub team_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thread_ts: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub ts: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TitleBlock {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub accessory: Option<Accessory>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub alt_text: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub app_collaborators: Option<Vec<String>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub app_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub author_name: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub block_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub bot_user_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub button_label: Option<String>,

    pub description: Option<DescriptionUnion>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub developer_trace_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub elements: Option<Vec<Accessory>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub fallback: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub fields: Option<Vec<DescriptionElement>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub function_trigger_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub image_bytes: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub image_height: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub image_url: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub image_width: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub is_animated: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub is_workflow_app: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub owning_team_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub provider_icon_url: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub provider_name: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub sales_home_workflow_app_type: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub share_url: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub slack_file: Option<SlackFile>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub text: Option<DescriptionElement>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub thumbnail_url: Option<String>,

    pub title: Option<DescriptionUnion>,

    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub title_block_type: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub title_url: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub trigger_subtype: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub trigger_type: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub url: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub video_url: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub workflow_id: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Accessory {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub accessibility_label: Option<String>,

    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub accessory_type: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub action_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub alt_text: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub border: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub confirm: Option<Confirm>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub default_to_current_conversation: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub elements: Option<Vec<AccessoryElement>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub fallback: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub filter: Option<Filter>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub focus_on_load: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub image_bytes: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub image_height: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub image_url: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub image_width: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub indent: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub initial_channel: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub initial_channels: Option<Vec<String>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub initial_conversation: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub initial_conversations: Option<Vec<String>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub initial_date: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub initial_date_time: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub initial_option: Option<Option_>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub initial_options: Option<Vec<Option_>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub initial_time: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub initial_user: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub initial_users: Option<Vec<String>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub max_selected_items: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub min_query_length: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub offset: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub option_groups: Option<Vec<OptionGroup>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub options: Option<Vec<Option_>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub placeholder: Option<DescriptionElement>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub response_url_enabled: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub slack_file: Option<SlackFile>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub style: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub text: Option<DescriptionElement>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub timezone: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub url: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub value: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub workflow: Option<Workflow>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Confirm {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub confirm: Option<DescriptionElement>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub deny: Option<DescriptionElement>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub style: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub text: Option<DescriptionElement>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub title: Option<DescriptionElement>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DescriptionElement {
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub description_type: Option<DescriptionType>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub emoji: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub text: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub verbatim: Option<bool>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum DescriptionType {
    Mrkdwn,

    #[serde(rename = "plain_text")]
    PlainText,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccessoryElement {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub border: Option<i64>,

    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub element_type: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub elements: Option<Vec<PurpleElement>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub indent: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub offset: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub style: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PurpleElement {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub channel_id: Option<String>,

    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub element_type: Option<ElementType>,

    #[serde(rename = "unsafe")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub element_unsafe: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub fallback: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub format: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub range: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub skin_tone: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub style: Option<Style>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub team_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub text: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub timestamp: Option<i64>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub unicode: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub url: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub user_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub usergroup_id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub value: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ElementType {
    Broadcast,

    Channel,

    Color,

    Date,

    Emoji,

    Link,

    Team,

    Text,

    User,

    Usergroup,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Style {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub bold: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub client_highlight: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub code: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub highlight: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub italic: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub strike: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub unlink: Option<bool>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Filter {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub exclude_bot_users: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub exclude_external_shared_channels: Option<bool>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub include: Option<Vec<Option<serde_json::Value>>>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Option_ {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub description: Option<DescriptionElement>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub text: Option<DescriptionElement>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub url: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub value: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OptionGroup {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub label: Option<DescriptionElement>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub options: Option<Vec<Option_>>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SlackFile {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub id: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub url: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Workflow {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub trigger: Option<Trigger>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Trigger {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub customizable_input_parameters: Option<Vec<CustomizableInputParameter>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub url: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CustomizableInputParameter {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub value: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum DescriptionUnion {
    DescriptionElement(DescriptionElement),

    String(String),
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Transcription {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub locale: Option<String>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub status: Option<String>,
}
