tino 0.1.23

tino: tiny init process (PID 1) for Docker/Kubernetes containers, written in Rust (tini alternative)
Documentation
use std::fmt;
use std::io::{self, Write};
use std::sync::atomic::{AtomicU8, Ordering};

#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd)]
enum Level {
    Warn = 1,
    Info = 2,
    Debug = 3,
}

impl Level {
    fn as_str(self) -> &'static str {
        match self {
            Self::Warn => "WARN",
            Self::Info => "INFO",
            Self::Debug => "DEBUG",
        }
    }
}

static MAX_LEVEL: AtomicU8 = AtomicU8::new(Level::Info as u8);

pub(crate) fn init(verbosity: u8) {
    let level = match verbosity {
        0 => Level::Info,
        _ => Level::Debug,
    };
    MAX_LEVEL.store(level as u8, Ordering::Relaxed);
}

pub(crate) fn debug_enabled() -> bool {
    enabled(Level::Debug)
}

pub(crate) fn warn(args: fmt::Arguments<'_>) {
    log(Level::Warn, args);
}

pub(crate) fn info(args: fmt::Arguments<'_>) {
    log(Level::Info, args);
}

pub(crate) fn debug(args: fmt::Arguments<'_>) {
    log(Level::Debug, args);
}

fn enabled(level: Level) -> bool {
    (level as u8) <= MAX_LEVEL.load(Ordering::Relaxed)
}

fn log(level: Level, args: fmt::Arguments<'_>) {
    if !enabled(level) {
        return;
    }

    let mut stderr = io::stderr().lock();
    let _ = writeln!(stderr, "{} tino: {}", level.as_str(), args);
}