// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

use log::{Level, Metadata, Record};

pub struct SimpleLogger;

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

    fn log(&self, record: &Record<'_>) {
        if self.enabled(record.metadata()) {
            println!("{} - {}", record.level(), record.args());
        }
    }

    fn flush(&self) {}
}

#[cfg(test)]
mod test {
    use super::*;
    use log::{Log, MetadataBuilder};

    #[test]
    fn enabled_test() {
        let logger = SimpleLogger {};

        let debug_metadata = MetadataBuilder::new().level(Level::Debug).target("fidldoc").build();
        assert!(logger.enabled(&debug_metadata));

        let trace_metadata = MetadataBuilder::new().level(Level::Trace).target("fidldoc").build();
        assert!(!logger.enabled(&trace_metadata));
    }
}
