af3facfbf0
This patch move the entities module to a helper-crate. With this, we give the user the opportunity to use only the entities types in their codebase, if need be. One scenario where this is required came up in https://github.com/dscottboggs/mastodon-async/issues/38 TL;DR is: A user needed to be able to pass types like `Status` from a backend part of an application to a frontend which was compiled to WASM. Because mastodon_async depends on tokio, which does not compile to WASM (at least not with the features required by mastodon_async). One option would have been to provide types in the application code which can be constructed from mastodon_asyncs entity types. This would lead to _a lot_ of code duplication (over several projects still,... but that's rather undesireable anyways). The solution mastodon_async offers with this patch is a helper-crate which only contains the entity types: mastodon_async_entities. mastodon_async publicly exports the whole mastodon_async_entities crate, so users do not have to depend on the latter directly. In addition to the `entities` module from mastodon_async, also the `Visibility` type had to be moved. `mastodon_async_entities` also got an own `Error` type, which `mastodon_async::Error` can of course wrap. Signed-off-by: Matthias Beyer <mail@beyermatthias.de> Suggested-by: D. Scott Boggs <scott@tams.tech> |
||
---|---|---|
.github | ||
.vscode | ||
entities | ||
examples | ||
src | ||
tests | ||
.env.sample | ||
.gitignore | ||
CHANGELOG.md | ||
Cargo.toml | ||
LICENCE-APACHE | ||
LICENCE-MIT | ||
README.md | ||
build.rs | ||
rustfmt.toml |
README.md
Async Mastodon client library
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:
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(())
}