#![cfg_attr(docsrs, feature(doc_cfg))]
use cfg_if::cfg_if;
mod color;
mod error;
mod fmt;
cfg_if! {
if #[cfg(all(any(unix, windows), not(terminal_colorsaurus_test_unsupported)))] {
mod io;
mod quirks;
mod xterm;
use xterm as imp;
} else {
mod unsupported;
use unsupported as imp;
}
}
cfg_if! {
if #[cfg(docsrs)] {
#[doc(cfg(docsrs))]
#[doc = include_str!("../doc/terminal-survey.md")]
pub mod terminal_survey {}
#[doc(cfg(docsrs))]
#[doc = include_str!("../doc/latency-rustdoc.md")]
pub mod latency {}
#[doc(cfg(docsrs))]
#[doc = include_str!("../doc/feature-detection.md")]
pub mod feature_detection {}
#[doc(cfg(docsrs))]
#[doc = include_str!("../doc/comparison.md")]
pub mod comparison {}
}
}
#[cfg(doctest)]
#[doc = include_str!("../readme.md")]
pub mod readme_doctests {}
pub use color::*;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub struct ColorPalette {
pub foreground: Color,
pub background: Color,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[allow(clippy::exhaustive_enums)]
#[doc(alias = "color scheme")]
pub enum ThemeMode {
Dark,
Light,
}
impl ColorPalette {
pub fn theme_mode(&self) -> ThemeMode {
let fg = self.foreground.perceived_lightness();
let bg = self.background.perceived_lightness();
if bg < fg {
ThemeMode::Dark
} else if bg > fg || bg > 0.5 {
ThemeMode::Light
} else {
ThemeMode::Dark
}
}
}
pub type Result<T> = std::result::Result<T, Error>;
pub use error::Error;
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub struct QueryOptions {
pub timeout: std::time::Duration,
}
impl Default for QueryOptions {
fn default() -> Self {
Self {
timeout: std::time::Duration::from_secs(1),
}
}
}
#[doc = include_str!("../doc/caveats.md")]
#[doc(alias = "theme")]
pub fn theme_mode(options: QueryOptions) -> Result<ThemeMode> {
color_palette(options).map(|p| p.theme_mode())
}
#[doc = include_str!("../doc/caveats.md")]
pub fn color_palette(options: QueryOptions) -> Result<ColorPalette> {
imp::color_palette(options)
}
#[doc = include_str!("../doc/caveats.md")]
#[doc(alias = "fg")]
pub fn foreground_color(options: QueryOptions) -> Result<Color> {
imp::foreground_color(options)
}
#[doc = include_str!("../doc/caveats.md")]
#[doc(alias = "bg")]
pub fn background_color(options: QueryOptions) -> Result<Color> {
imp::background_color(options)
}
#[cfg(test)]
#[path = "theme_mode_tests.rs"]
mod tests;