vsd 0.5.0

A command-line utility and library for downloading streams from DASH manifests and HLS playlists.
Documentation
use colored::{ColoredString, Colorize};
use log::{Level, LevelFilter, Metadata, Record};

pub struct Logger;

impl log::Log for Logger {
    fn enabled(&self, metadata: &Metadata) -> bool {
        metadata.level() <= Level::Trace
    }

    fn log(&self, record: &Record) {
        if self.enabled(record.metadata()) {
            match log::max_level() {
                LevelFilter::Off => (),
                LevelFilter::Error | LevelFilter::Warn | LevelFilter::Info => {
                    match record.level() {
                        Level::Info => {
                            println!("{}", record.args());
                        }
                        _ => {
                            let mut label = label(record.level());
                            label.input = label.input.trim_start().to_owned();
                            println!("{} {}", label, record.args());
                        }
                    }
                }
                LevelFilter::Debug | LevelFilter::Trace if record.target().starts_with("vsd") => {
                    let location = match (record.file(), record.line()) {
                        (Some(file), Some(line)) => {
                            format!("{:>30}", format!("{}:{}", file, line)).dimmed()
                        }
                        _ => format!("{:>30}", "unk:unk").dimmed(),
                    };

                    println!("{}{} {}", label(record.level()), location, record.args());
                }
                _ => (),
            }
        }
    }

    fn flush(&self) {}
}

fn label(level: Level) -> ColoredString {
    match level {
        Level::Debug => "[DEBUG]".bold().blue(),
        Level::Error => "[ERROR]".bold().red(),
        Level::Info => " [INFO]".bold().green(),
        Level::Trace => "[TRACE]".bold().purple(),
        Level::Warn => " [WARN]".bold().yellow(),
    }
}