1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
//! Traits for common context fields.
//!
//! Suppose that you want to process users' photos whenever they send or edit
//! one. You would like to abstract this as much as possible, like this:
//!
//! ```
//! # async fn process_photo<T>(_: std::sync::Arc<T>) { }
//! let mut bot = tbot::from_env!("BOT_TOKEN").event_loop();
//! bot.photo(process_photo);
//! bot.edited_photo(process_photo);
//! ```
//!
//! However, in the first case we have [`contexts::Photo`], but in the second
//! one we have [`contexts::EditedPhoto`]. Luckily, they both implement
//! [`fields::Photo`], which allows accessing the `photo` field without caring
//! about the exact update type. So, if you already have this handler:
//!
//! ```
//! use std::sync::Arc;
//! use tbot::{contexts};
//! async fn process_photo(context: Arc<contexts::Photo>) {
//! let photo = &context.photo;
//! // ..
//! }
//! ```
//!
//! You can generalize it to this one in order to also support
//! [`contexts::EditedPhoto`]:
//!
//! ```
//! use std::sync::Arc;
//! use tbot::{contexts::fields::Photo};
//! async fn process_photo(context: Arc<impl Photo>) {
//! let photo = context.photo();
//! // ..
//! }
//! ```
//!
//! [`contexts::Photo`]: super::Photo
//! [`contexts::EditedPhoto`]: super::EditedPhoto
//! [`fields::Photo`]: Photo
mod album;
mod attachments;
mod callback;
mod context;
mod messages;
mod texts;
pub use {
album::Album,
attachments::{Animation, Audio, Document, Location, Photo, Video},
callback::Callback,
context::Context,
messages::{EditedMessage, Forward, MediaMessage, Message},
texts::{AnyText, Caption, Text},
};