foukoapi 0.1.0-alpha.1

Cross-platform bot framework in Rust. Write your handlers once, run the same bot on Telegram and Discord with shared accounts, embeds, keyboards and SQLite storage.
Documentation
[package]
name = "foukoapi"
version = "0.1.0-alpha.1"
edition = "2021"
rust-version = "1.75"
authors = ["Fouko <mail@fouko.xyz>"]
description = "Cross-platform bot framework in Rust. Write your handlers once, run the same bot on Telegram and Discord with shared accounts, embeds, keyboards and SQLite storage."
license = "MIT"
repository = "https://github.com/FoukoDev/FoukoApi"
homepage = "https://api.fouko.xyz"
documentation = "https://docs.rs/foukoapi"
readme = "README.md"
keywords = ["bot", "telegram", "discord", "chat", "framework"]
categories = ["api-bindings", "asynchronous"]
include = [
    "src/**/*.rs",
    "examples/**/*.rs",
    "Cargo.toml",
    "README.md",
    "LICENSE",
]

[features]
default = ["telegram", "discord", "sqlite"]

# Telegram adapter (via teloxide). Pulls in a rustls-only reqwest so the
# build stays libc-friendly on Alpine/musl/etc.
telegram = ["dep:teloxide", "dep:url", "dep:reqwest"]

# Discord adapter (via serenity, rustls-only).
discord = ["dep:serenity"]

# Bundled SQLite storage backend. Auto-selected by `open_storage` when
# FOUKO_DB looks like `sqlite:/path` or isn't set at all.
sqlite = ["dep:rusqlite"]

# Convenience meta-feature.
full = ["telegram", "discord", "sqlite"]

[dependencies]
tokio = { version = "1.40", features = ["rt-multi-thread", "macros", "signal", "sync", "time"] }
futures = "0.3"
async-trait = "0.1"
thiserror = "1"
tracing = "0.1"
dotenvy = "0.15"

# --- Optional platform adapters ---------------------------------------------

teloxide = { version = "0.13", default-features = false, features = ["macros", "rustls", "ctrlc_handler"], optional = true }
reqwest = { version = "0.11", default-features = false, features = ["rustls-tls", "socks"], optional = true }
url = { version = "2", optional = true }
serenity = { version = "0.12", default-features = false, features = ["client", "gateway", "rustls_backend", "model", "utils"], optional = true }

# --- Optional storage backends ----------------------------------------------

rusqlite = { version = "0.30", features = ["bundled"], optional = true }

[dev-dependencies]
tokio = { version = "1.40", features = ["full"] }
tracing-subscriber = { version = "0.3", features = ["env-filter"] }

[[example]]
name = "quickstart"
required-features = ["telegram", "discord"]

[package.metadata.docs.rs]
all-features = true
rustdoc-args = ["--cfg", "docsrs"]