ferogram-derive 0.6.3

Procedural macros for ferogram - #[derive(FsmState)]
Documentation

ferogram-derive

Procedural macros for the ferogram workspace. Currently exposes #[derive(FsmState)].

Crates.io Telegram Channel docs.rs License: MIT OR Apache-2.0

Most people get this through ferogram with the derive feature flag. Direct usage is only needed when building on top of the FSM layer without the full client.

For installation instructions see the ferogram README.


#[derive(FsmState)]

Implements the ferogram::fsm::FsmState trait for an enum. Only unit variants are supported; tuple or struct variants produce a compile error.

What gets generated: as_key(&self) -> String and from_key(key: &str) -> Option<Self>, both using the variant name as written in source.

use ferogram::FsmState;

#[derive(FsmState, Clone, Debug, PartialEq)]
enum RegistrationState {
    Start,
    WaitingName,
    WaitingPhone,
    Done,
}

Keys are the variant names as written. Renaming a variant changes its key and breaks any stored state.


Using FsmState in a dispatcher

use ferogram::{FsmState, fsm::MemoryStorage, filters::text};
use std::sync::Arc;

#[derive(FsmState, Clone, Debug, PartialEq)]
enum Form { Name, Age, Done }

dp.with_state_storage(Arc::new(MemoryStorage::new()));

dp.on_message_fsm(text(), Form::Name, |msg, state| async move {
    state.set_data("name", msg.text().unwrap()).await.ok();
    state.transition(Form::Age).await.ok();
    msg.reply("How old are you?").await.ok();
});

dp.on_message_fsm(text(), Form::Age, |msg, state| async move {
    let name = state.get_data("name").await.unwrap_or_default();
    state.transition(Form::Done).await.ok();
    msg.reply(format!("Got it, {name}!")).await.ok();
});

Stack position

ferogram
└ ferogram-derive  <-- here (proc-macro crate, compile-time only)

License

MIT or Apache-2.0, at your option. See LICENSE-MIT and LICENSE-APACHE.

Ankit Chaubey - github.com/ankit-chaubey