reporters 0.1.0

Reporter will help you in sending a piece of information or message to different destinations e.g. email inbox, slack channel etc
Documentation
use std::env;
use dotenv::dotenv;
use log;
use chrono;
use std::{thread, time::Duration};
use reporters::{Reporter, ReporterKind, EmailReporter};

fn setup_logger() -> Result<(), fern::InitError> {
    fern::Dispatch::new()
        .format(|out, message, record| {
            out.finish(format_args!(
                "{}[{}][{}] {}",
                chrono::Local::now().format("[%Y-%m-%d][%H:%M:%S]"),
                record.target(),
                record.level(),
                message
            ))
        })
        .level(log::LevelFilter::Debug)
        .chain(std::io::stdout())
        .chain(fern::log_file("output.log")?)
        .apply()?;
    Ok(())
}    

fn check_status(endpoint: &String) -> Result<bool, reqwest::Error> {
    let status = reqwest::blocking::get(endpoint)?
        .status();

    return Ok(status == 200)
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    dotenv()?;
    setup_logger()?;
    
    let mut reporter = Reporter::new();

    let mut email_reporter = EmailReporter::new();
    email_reporter
        .to(Some(env::var("REPORTER_MAIL_TO").expect("REPORTER_MAIL_TO env not set!")))
        .from(Some(env::var("REPORTER_MAIL_FROM").expect("REPORTER_MAIL_FROM env not set!")))
        .subject(Some(env::var("REPORTER_MAIL_SUBJECT").expect("REPORTER_MAIL_SUBJECT env not set!")))
        .smtp_username(Some(env::var("REPORTER_MAIL_SMTP_USERNAME").expect("REPORTER_MAIL_SMTP_USERNAME env not set!")))
        .smtp_password(Some(env::var("REPORTER_MAIL_SMTP_PASSWORD").expect("REPORTER_MAIL_SMTP_PASSWORD env not set!")))
        .body(Some(String::from("Error world!")));
        
    reporter.add_reporter(
        ReporterKind::EmailReporter(email_reporter)
    );

    loop {
        thread::sleep(Duration::from_secs(1));

        let endpoint = env::var("REPORTER_ENDPOINT").expect("REPORTER_ENDPOINT env not set!");

        if check_status(&endpoint).ok() != None {
            log::info!("App is working :)");
    
            continue;
        }

        reporter.report();

        log::info!("App is down :(");

        break;
    }

    Ok(())
}