auto_derived!( /// File pub struct File { /// Unique Id #[serde(rename = "_id")] pub id: String, /// Tag / bucket this file was uploaded to pub tag: String, /// Original filename pub filename: String, /// Parsed metadata of this file pub metadata: Metadata, /// Raw content type of this file pub content_type: String, /// Size of this file (in bytes) pub size: isize, /// Whether this file was deleted #[serde(skip_serializing_if = "Option::is_none")] pub deleted: Option, /// Whether this file was reported #[serde(skip_serializing_if = "Option::is_none")] pub reported: Option, // TODO: migrate this mess to having: // - author_id // - parent: Parent { Message(id), User(id), etc } #[serde(skip_serializing_if = "Option::is_none")] pub message_id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub user_id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub server_id: Option, /// Id of the object this file is associated with #[serde(skip_serializing_if = "Option::is_none")] pub object_id: Option, } /// Metadata associated with a file #[serde(tag = "type")] #[derive(Default)] pub enum Metadata { /// File is just a generic uncategorised file #[default] File, /// File contains textual data and should be displayed as such Text, /// File is an image with specific dimensions Image { width: usize, height: usize }, /// File is a video with specific dimensions Video { width: usize, height: usize }, /// File is audio Audio, } );