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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
//! # Client module.
//! This module contains the main struct you will use to interact with the QStash API.
//! It is initialized with a token and optionally a base url and a version.
//! The default base url is `https://qstash.upstash.io`.
pub mod dead_letter_queue;
mod error;
pub mod events;
pub mod messages;
pub mod publish;
mod request;
use error::*;
pub use request::*;
use reqwest::{header, Url};
/// The version of the QStash API to use.
/// The default is V2.
pub enum Version {
V1,
V2,
}
/// The QStash client.
/// It is initialized with a token and optionally a base url and a version.
/// The default base url is `https://qstash.upstash.io`.
/// The default version is V2.
pub struct Client {
pub http: reqwest::Client,
base_url: Url,
version: String,
}
impl Client {
/// Initialize a new QStash client.
/// The token is required.
/// The base url and version are optional.
pub fn new(
token: &str,
base_url: Option<&str>,
version: Option<Version>,
) -> Result<Client, QStashError> {
// intialize default headers
let mut value = match header::HeaderValue::from_str(&format!("Bearer {token}")) {
Ok(v) => v,
Err(e) => {
let formated_string = e.to_string();
tracing::error!(formated_string);
return Err(QStashError::TokenError);
}
};
value.set_sensitive(true);
let mut headers = header::HeaderMap::new();
headers.insert(header::AUTHORIZATION, value);
// initialize reqwest client
let http = match reqwest::Client::builder().default_headers(headers).build() {
Ok(c) => c,
Err(e) => {
let formated_string = e.to_string();
tracing::error!(formated_string);
return Err(QStashError::ReqwestError);
}
};
let version = match version.unwrap_or(Version::V2) {
Version::V1 => String::from("v1"),
Version::V2 => String::from("v2"),
};
// parsing url from the provided value or use default
let url = match Url::parse(base_url.unwrap_or("https://qstash.upstash.io")) {
Ok(u) => u,
Err(e) => {
let formated_string = e.to_string();
tracing::error!(formated_string);
return Err(QStashError::InvalidUrl);
}
};
Ok(Self {
http,
base_url: url,
version,
})
}
}