chatwork 0.1.0

Chatwork API client.
Documentation
use reqwest::multipart::{Form, Part};

use std::borrow::Cow;

crate::derive_service! {
    pub struct Service {
        pub(super) inner: crate::Client,
        pub(super) room_id: i64,
    }
}

impl Service {
    pub async fn list(&self, list: &List) -> crate::Result<Vec<File>> {
        self.inner
            .get(crate::path_and_query!("/rooms/{room_id}/files", room_id = self.room_id; list))
            .await
    }

    pub async fn get(&self, file_id: i64, get: &Get) -> crate::Result<File> {
        self.inner
            .get(crate::path_and_query!("/rooms/{room_id}/files/{file_id}", room_id = self.room_id, file_id = file_id; get))
            .await
    }

    pub async fn create<T>(&self, create: Create<T>) -> crate::Result<FileId>
    where
        T: Into<Cow<'static, str>>,
    {
        let Create { file, message } = create;
        let mut form = Form::new().part("file", file.into());
        if let Some(message) = message {
            form = form.part("message", Part::text(message));
        }
        self.inner
            .multipart(
                crate::path_and_query!("/rooms/{room_id}/files", room_id = self.room_id),
                form,
            )
            .await
    }
}

crate::derive_query_or_form! {
    pub struct List {
        pub account_id: Option<i64>,
    }
}

crate::derive_query_or_form! {
    pub struct Get {
        #[serde(serialize_with = "crate::serde::opt_bool_to_u8")]
        pub create_download_url: Option<bool>,
    }
}

#[derive(Debug)]
pub struct Create<T> {
    file: crate::file::File,
    message: Option<T>,
}

impl Create<&'static str> {
    pub fn new(file: crate::file::File) -> Self {
        Self { file, message: None }
    }

    pub fn message<T>(self, message: T) -> Create<T>
    where
        T: Into<Cow<'static, str>>,
    {
        Create { file: self.file, message: Some(message) }
    }
}

crate::derive_model! {
    pub struct FileId {
        pub file_id: i64,
    }
}

crate::derive_model! {
    pub struct File {
        pub account: crate::v2::Account,
        pub download_url: Option<String>,
        pub file_id: i64,
        pub filename: String,
        pub filesize: i64,
        pub message_id: String,
        pub upload_time: i64,
    }
}