Go to file
D. Scott Boggs eeac76c750 Add CI jobs to comb branch 2023-01-24 15:33:49 -05:00
.github Add CI jobs to comb branch 2023-01-24 15:33:49 -05:00
.vscode spelling and clippy fixes 2022-12-29 06:41:57 -05:00
entities Add static assertions 2023-01-09 09:03:21 -05:00
examples Make tokio's rt-multi-thread enabled again in examples 2023-01-01 11:22:43 -05:00
src Fix errors caused by sync locks crossing `await` in `cli::authenticate` 2023-01-20 16:55:26 -05:00
tests Move prelude use statements to separate fn 2023-01-03 07:02:36 -05:00
.env.sample Update Rust Edition; Update dependencies 2022-11-29 18:50:29 -05:00
.gitignore Wrap magic cookie in a mutex 2022-12-28 08:49:43 -05:00
CHANGELOG.md Rename elefren to mastodon-async 2022-12-23 12:18:03 -05:00
Cargo.toml Make package fields workspace-wide 2023-01-04 08:29:52 -05:00
LICENCE-APACHE Rename elefren to mastodon-async 2022-12-23 12:18:03 -05:00
LICENCE-MIT Rename elefren to mastodon-async 2022-12-23 12:18:03 -05:00
README.md Add note pointing to more complete example. 2023-01-21 05:33:41 -05:00
build.rs initial state; elefren 0.22.0 2022-11-27 09:44:43 -05:00
rustfmt.toml Empty rustfmt configuration for default settings 2022-12-29 07:14:00 -05:00

README.md

Async Mastodon client library

[Build Status] crates.io Docs MIT/APACHE-2.0

Documentation

A type-safe, async wrapper around the client API for Mastodon

Installation

To add mastodon-async to your project, add the following to the [dependencies] section of your Cargo.toml

mastodon-async = "1.0"

Alternatively, run the following command:

$ cargo add mastodon-async

A Note on Debugging

This library offers structured logging. To get better information about bugs or how something is working, I recommend adding the femme crate as a dependency, then adding this line to the beginning of your main() function:

femme::with_level(log::LevelFilter::Trace);

When compiling for the debug target, this offers a mostly-human-readable output with a lot of details about what's happening. When targeting release, JSON- structured metadata is offered, which can be filtered and manipulated with scripts or at the shell with jq.

There are other crates which make use of the log crate's new (unstable) kv features, this is just the one that works for me for now.

Example

In your Cargo.toml, make sure you enable the toml feature:

[dependencies.mastodon-async]
version = "1.0"
features = ["toml"]
// src/main.rs

use mastodon_async::prelude::*;
use mastodon_async::helpers::toml; // requires `features = ["toml"]`
use mastodon_async::{helpers::cli, Result};

#[tokio::main]
async fn main() -> Result<()> {
    let mastodon = if let Ok(data) = toml::from_file("mastodon-data.toml") {
        Mastodon::from(data)
    } else {
        register().await?
    };

    let you = mastodon.verify_credentials().await?;

    println!("{:#?}", you);

    Ok(())
}

async fn register() -> Result<Mastodon> {
    let registration = Registration::new("https://botsin.space")
                                    .client_name("mastodon-async-examples")
                                    .build()
                                    .await?;
    let mastodon = cli::authenticate(registration).await?;

    // Save app data for using on the next run.
    toml::to_file(&mastodon.data, "mastodon-data.toml")?;

    Ok(mastodon)
}

It also supports the Streaming API:

Note: this example compiles, but will not run. See the log_events example for a more thorough example which does compile and run.

use mastodon_async::{prelude::*, Result, entities::event::Event};
use futures_util::TryStreamExt;

#[tokio::main]
async fn main() -> Result<()> {
    let client = Mastodon::from(Data::default());

    client.stream_user()
        .await?
        .try_for_each(|event| async move {
            match event {
                Event::Update(ref status) => { /* .. */ },
                Event::Notification(ref notification) => { /* .. */ },
                Event::Delete(ref id) => { /* .. */ },
                Event::FiltersChanged => { /* .. */ },
            }
            Ok(())
        })
        .await?;
    Ok(())
}