use std::sync::Arc;
use crate::integration::Integration;
use crate::protocol::ErrorEvent;
use crate::transport::TransportFactory;
pub const DEFAULT_HOST: &str = "https://api.allstak.sa";
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum SessionMode {
#[default]
Application,
Request,
}
type BeforeSend = Arc<dyn Fn(ErrorEvent) -> Option<ErrorEvent> + Send + Sync>;
type BeforeBreadcrumb =
Arc<dyn Fn(crate::protocol::Breadcrumb) -> Option<crate::protocol::Breadcrumb> + Send + Sync>;
#[derive(Clone)]
pub struct ClientOptions {
pub api_key: String,
pub host: String,
pub release: Option<String>,
pub environment: Option<String>,
pub server_name: Option<String>,
pub sample_rate: f32,
pub traces_sample_rate: f32,
pub max_breadcrumbs: usize,
pub attach_stacktrace: bool,
pub send_default_pii: bool,
pub in_app_include: Vec<String>,
pub in_app_exclude: Vec<String>,
pub before_send: Option<BeforeSend>,
pub before_breadcrumb: Option<BeforeBreadcrumb>,
pub debug: bool,
pub shutdown_timeout: std::time::Duration,
pub auto_session_tracking: bool,
pub session_mode: SessionMode,
pub default_integrations: bool,
pub integrations: Vec<Arc<dyn Integration>>,
pub transport: Option<Arc<dyn TransportFactory>>,
pub transport_queue_size: usize,
}
impl std::fmt::Debug for ClientOptions {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ClientOptions")
.field("host", &self.host)
.field("release", &self.release)
.field("environment", &self.environment)
.field("sample_rate", &self.sample_rate)
.field("traces_sample_rate", &self.traces_sample_rate)
.field("max_breadcrumbs", &self.max_breadcrumbs)
.field("send_default_pii", &self.send_default_pii)
.field("auto_session_tracking", &self.auto_session_tracking)
.field("session_mode", &self.session_mode)
.field("integrations", &self.integrations.len())
.finish_non_exhaustive()
}
}
impl Default for ClientOptions {
fn default() -> Self {
ClientOptions {
api_key: String::new(),
host: DEFAULT_HOST.to_string(),
release: None,
environment: None,
server_name: None,
sample_rate: 1.0,
traces_sample_rate: 0.0,
max_breadcrumbs: 100,
attach_stacktrace: false,
send_default_pii: false,
in_app_include: Vec::new(),
in_app_exclude: Vec::new(),
before_send: None,
before_breadcrumb: None,
debug: false,
shutdown_timeout: std::time::Duration::from_secs(2),
auto_session_tracking: true,
session_mode: SessionMode::Application,
default_integrations: true,
integrations: Vec::new(),
transport: None,
transport_queue_size: 1000,
}
}
}
impl ClientOptions {
pub fn resolved_environment(&self) -> String {
self.environment.clone().unwrap_or_else(|| {
if cfg!(debug_assertions) {
"development".to_string()
} else {
"production".to_string()
}
})
}
}
pub trait IntoClientOptions {
fn into_client_options(self) -> ClientOptions;
}
impl IntoClientOptions for ClientOptions {
fn into_client_options(self) -> ClientOptions {
self
}
}
impl IntoClientOptions for &str {
fn into_client_options(self) -> ClientOptions {
ClientOptions {
api_key: self.to_string(),
..ClientOptions::default()
}
}
}
impl IntoClientOptions for String {
fn into_client_options(self) -> ClientOptions {
ClientOptions {
api_key: self,
..ClientOptions::default()
}
}
}
impl IntoClientOptions for (&str, ClientOptions) {
fn into_client_options(self) -> ClientOptions {
let (api_key, mut opts) = self;
opts.api_key = api_key.to_string();
opts
}
}
impl IntoClientOptions for (String, ClientOptions) {
fn into_client_options(self) -> ClientOptions {
let (api_key, mut opts) = self;
opts.api_key = api_key;
opts
}
}