use reqwest::{multipart, StatusCode}; #[derive(Debug)] pub enum Error { ReqwestError(reqwest::Error), FailureStatus(reqwest::StatusCode) } impl From for Error { fn from(value: reqwest::Error) -> Self { Self::ReqwestError(value) } } #[derive(Copy, Clone)] pub enum Visibility { Public, Unlisted, Private, Direct } impl Visibility { pub fn enum_name(&self) -> &'static str { match self { Self::Public => "public", Self::Unlisted => "unlisted", Self::Private => "private", Self::Direct => "direct", } } } #[derive(Clone)] pub struct Mastodon { instance: String, token: String } impl Mastodon { pub fn new(instance: String, token: String) -> Self { Mastodon { instance, token } } pub async fn post_text_status(&self, status: String, visibility: Visibility) -> Result<(), Error> { let form = multipart::Form::new() .text("status", status) .text("visibility", visibility.enum_name()); let client = reqwest::Client::new(); let response = client .post(format!("{}/api/v1/statuses", self.instance)) .header("Authorization", format!("Bearer {}", self.token)) .multipart(form) .send().await?; match response.status() { StatusCode::OK => Ok(()), s => Err(Error::FailureStatus(s)) } } }