use std::{
io::IsTerminal,
ops::{Deref, DerefMut},
path::PathBuf,
};
use serde::{Deserialize, Serialize};
mod component;
mod non_blocking;
pub use component::Tracing;
#[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)]
#[serde(
deny_unknown_fields,
default,
from = "InnerConfig",
into = "InnerConfig"
)]
pub struct Config {
inner: InnerConfig,
}
impl Deref for Config {
type Target = InnerConfig;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl DerefMut for Config {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}
impl From<InnerConfig> for Config {
fn from(inner: InnerConfig) -> Self {
Self { inner }
}
}
impl From<Config> for InnerConfig {
fn from(config: Config) -> Self {
config.inner
}
}
#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]
#[serde(deny_unknown_fields, default)]
pub struct InnerConfig {
pub use_color: bool,
pub force_use_color: bool,
pub filter: Option<String>,
pub buffer_limit: usize,
#[serde(skip_serializing)]
pub flamegraph: Option<PathBuf>,
#[serde(skip_serializing)]
pub progress_bar: Option<ProgressConfig>,
pub log_file: Option<PathBuf>,
#[serde(skip_serializing)]
pub use_journald: bool,
#[serde(skip_serializing)]
pub opentelemetry_endpoint: Option<String>,
#[serde(skip_serializing)]
pub opentelemetry_service_name: Option<String>,
#[serde(skip_serializing)]
pub opentelemetry_sample_percent: Option<u8>,
}
#[derive(Copy, Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum ProgressConfig {
Detailed,
#[default]
#[serde(other)]
Summary,
}
impl Config {
pub fn use_color_stdout(&self) -> bool {
self.force_use_color || (self.use_color && std::io::stdout().is_terminal())
}
pub fn use_color_stderr(&self) -> bool {
self.force_use_color || (self.use_color && std::io::stderr().is_terminal())
}
}
impl Default for InnerConfig {
fn default() -> Self {
Self {
use_color: true,
force_use_color: false,
filter: None,
buffer_limit: 128_000,
flamegraph: None,
progress_bar: None,
log_file: None,
use_journald: false,
opentelemetry_endpoint: None,
opentelemetry_service_name: None,
opentelemetry_sample_percent: None,
}
}
}