Current section
Files
Jump to
Current section
Files
src/telega_hackney.gleam
//// hackney adapter for the Telega Telegram Bot Library.
////
//// Provides a `TelegramClient` that uses `gleam_hackney` as the HTTP backend.
////
//// ```gleam
//// import telega
//// import telega_hackney
////
//// pub fn main() {
//// let client = telega_hackney.new("BOT_TOKEN")
//// let assert Ok(_bot) =
//// telega.new_for_polling(client)
//// |> telega.with_router(router)
//// |> telega.init_for_polling_nil_session()
//// }
//// ```
import gleam/bytes_tree
import gleam/hackney
import gleam/http/request.{type Request}
import gleam/http/response.{type Response}
import gleam/result
import gleam/string
import telega/client
import telega/error.{type TelegaError}
/// Create a new Telegram client using hackney as the HTTP backend.
///
/// This sets up both `FetchClient` (for JSON API calls) and
/// `FetchBitsClient` (for binary file downloads).
pub fn new(token token: String) -> client.TelegramClient {
client.new(token:, fetch_client: fetch_adapter)
|> client.set_fetch_bits_client(fetch_bits_adapter)
}
/// The hackney fetch adapter for JSON API requests.
///
/// Exposed so you can use it with `client.set_fetch_client` if needed.
pub fn fetch_adapter(
req: Request(String),
) -> Result(Response(String), TelegaError) {
hackney.send(req)
|> result.map_error(fn(err) { error.FetchError(string.inspect(err)) })
}
/// The hackney fetch adapter for binary file downloads.
///
/// Exposed so you can use it with `client.set_fetch_bits_client` if needed.
pub fn fetch_bits_adapter(
req: Request(BitArray),
) -> Result(Response(BitArray), TelegaError) {
req
|> request.map(bytes_tree.from_bit_array)
|> hackney.send_bits
|> result.map_error(fn(err) { error.FetchError(string.inspect(err)) })
}