mutiny-rs 0.2.0

A Rust API wrapper for the Stoat chat platform.
Documentation
use crate::builders::edit_message::EditMessageBuilder;
use crate::context::Context;
use crate::http::HttpError;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use crate::model::channel::{ChannelId, PendingSend};
use crate::model::embed::Embed;
use crate::model::ready::Member;
use crate::model::user::User;

#[derive(Debug, Default)]
pub struct SendMessage {
    pub content: String,
    pub nonce: Option<String>,
    pub attachments: Vec<String>,
    pub replies: HashMap<String, bool>,
    pub embeds: Vec<Embed>,
}

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Message {
    #[serde(rename = "_id")]
    pub id: String,
    pub nonce: Option<String>,
    pub channel: ChannelId,
    pub author: String,
    pub user: Option<User>,
    pub member: Option<Member>,
    #[serde(default)]
    pub content: String,
    pub mentions: Option<Vec<String>>,
    pub attachments: Option<Vec<MessageAttachments>>,
    pub edited: Option<String>
}

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct MessageAttachments {
    #[serde(rename = "_id")]
    pub id: String,
    pub tag: String,
    pub filename: String,
    pub metadata: MessageMetadata,
    pub content_type: String,
    pub size: usize
}

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct MessageMetadata {
    #[serde(rename = "type")]
    pub _type: String,
    pub width: usize,
    pub height: usize,
}

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Replies {
    pub id: String,
    pub mention: bool,
    pub fail_if_not_exists: Option<bool>,
}

impl Message {
    pub fn reply<'a>(&'a self, ctx: &'a Context) -> PendingSend<'a> {
        self.channel.send(ctx).replies(vec![
            Replies {
                id: self.id.clone(),
                mention: true,
                fail_if_not_exists: Some(true),
            }
        ])
    }
    pub async fn author(&self, ctx: &Context) -> Option<User> {
        ctx.cache.users.get(&self.author).await
    }

    pub async fn fetch_author(&self, ctx: &Context) -> Result<User, HttpError> {
        if let Some(user) = self.author(ctx).await {
            return Ok(user);
        }

        let user = ctx.http.fetch_user(&self.author).await?;

        ctx.cache.users.insert(user.id.clone(), user.clone()).await;

        Ok(user)
    }

    pub fn edit<'a>(&'a self, ctx: &'a Context) -> EditMessageBuilder<'a> {
        EditMessageBuilder {
            message: self,
            ctx,
            content: None,
            embeds: None,
        }
    }
}