scaffold mastodon client

This commit is contained in:
Denis-Cosmin Nutiu 2025-01-04 15:29:38 +02:00
parent 05ab839ed6
commit 287beed7d6
3 changed files with 67 additions and 0 deletions

View file

@ -12,6 +12,7 @@ use std::thread;
mod bluesky;
mod cli;
mod mastodon;
//noinspection DuplicatedCode
/// Sets up a signal handler in a separate thread to handle SIGINT and SIGTERM signals.

34
bot/src/mastodon.rs Normal file
View file

@ -0,0 +1,34 @@
use crate::mastodon::api::{PartialMediaResponse, PartialPostStatusResponse, PostStatusRequest};
mod api;
/// The Mastodon client for interacting with the platform.
pub struct MastodonClient {
access_token: String,
client: reqwest::Client,
}
impl MastodonClient {
/// Creates a new mastodon client from the given access token.
fn new(access_token: String) -> Self {
let client = reqwest::Client::new();
MastodonClient {
access_token,
client,
}
}
async fn post_status<T>(&mut self, data: T) -> Result<PartialPostStatusResponse, anyhow::Error>
where
T: Into<PostStatusRequest>,
{
unimplemented!()
}
async fn upload_media_by_url(
&mut self,
image_url: &str,
) -> Result<PartialMediaResponse, anyhow::Error> {
unimplemented!()
}
}

32
bot/src/mastodon/api.rs Normal file
View file

@ -0,0 +1,32 @@
use serde::{Deserialize, Serialize};
/// Is a truncated response from Mastodon's /api/v2/media endpoint.
/// See: https://docs.joinmastodon.org/methods/media/#v2
#[derive(Serialize, Deserialize, Debug)]
pub struct PartialMediaResponse {
pub id: String,
#[serde(rename = "type")]
pub r#type: String,
pub url: String,
}
/// PostStatusRequest is the request made to post a status on Mastodon.
/// See: https://docs.joinmastodon.org/methods/statuses/#create
#[derive(Serialize, Deserialize, Debug)]
pub struct PostStatusRequest {
pub status: String,
pub language: String,
pub visibility: String,
pub media_ids: Vec<u64>,
}
/// Is a partial response from /api/v1/statuses route.
/// See: https://docs.joinmastodon.org/methods/statuses/#create
#[derive(Serialize, Deserialize, Debug)]
pub struct PartialPostStatusResponse {
pub id: String,
pub created_at: String,
pub visibility: String,
pub uri: String,
pub url: String,
}