use std::{sync::Arc, time::Duration};
use hyper_util::{client::legacy::Client as HyperClient, rt::TokioExecutor};
use crate::Configuration;
const CRATE_VERSION: &str = env!("CARGO_PKG_VERSION");
pub struct SvixOptions {
pub debug: bool,
pub server_url: Option<String>,
pub timeout: Option<Duration>,
pub num_retries: Option<u32>,
pub retry_schedule: Option<Vec<Duration>>,
pub proxy_address: Option<String>,
}
impl Default for SvixOptions {
fn default() -> Self {
Self {
debug: false,
server_url: None,
timeout: Some(Duration::from_secs(15)),
num_retries: None,
retry_schedule: None,
proxy_address: None,
}
}
}
#[derive(Clone)]
pub struct Svix {
pub(super) cfg: Arc<Configuration>,
server_url: Option<String>,
}
impl Svix {
pub fn new(token: String, options: Option<SvixOptions>) -> Self {
let options = options.unwrap_or_default();
let cfg = Arc::new(Configuration {
user_agent: Some(format!("svix-libs/{CRATE_VERSION}/rust")),
client: HyperClient::builder(TokioExecutor::new())
.build(crate::make_connector(options.proxy_address)),
timeout: options.timeout,
base_path: String::new(),
bearer_access_token: None,
num_retries: options.num_retries.unwrap_or(2),
retry_schedule: options.retry_schedule,
});
let svix = Self {
cfg,
server_url: options.server_url,
};
svix.with_token(token)
}
pub fn with_token(&self, token: String) -> Self {
let base_path = self.server_url.clone().unwrap_or_else(|| {
match token.split('.').next_back() {
Some("us") => "https://api.us.svix.com",
Some("eu") => "https://api.eu.svix.com",
Some("in") => "https://api.in.svix.com",
Some("ca") => "https://api.ca.svix.com",
Some("au") => "https://api.au.svix.com",
_ => "https://api.svix.com",
}
.to_string()
});
let cfg = Arc::new(Configuration {
base_path,
user_agent: self.cfg.user_agent.clone(),
bearer_access_token: Some(token),
client: self.cfg.client.clone(),
timeout: self.cfg.timeout,
num_retries: self.cfg.num_retries,
retry_schedule: self.cfg.retry_schedule.clone(),
});
Self {
cfg,
server_url: self.server_url.clone(),
}
}
#[cfg(feature = "svix_beta")]
pub fn cfg(&self) -> &Configuration {
&self.cfg
}
}
#[cfg(test)]
mod tests {
use crate::api::Svix;
#[test]
fn test_future_send_sync() {
fn require_send_sync<T: Send + Sync>(_: T) {}
let svix = Svix::new(String::new(), None);
let message_api = svix.message();
let fut = message_api.expunge_content(String::new(), String::new());
require_send_sync(fut);
}
}