mod email;
mod logger;
use crate::email::email_provider::{get_email_provider, EmailProvider};
use dotenvy::dotenv;
use env_logger::Env;
use rss2email_lib::{download_blogs, map_to_html, time_func};
fn core_main() -> Result<(), String> {
if env_logger::Builder::from_env(Env::default().default_filter_or("info"))
.try_init()
.is_ok()
{};
let _env = dotenv();
let days_default: i64 = 7;
let days = std::env::var("DAYS").map_or(days_default, |v| {
v.parse::<i64>()
.map_err(|e| {
warn!("Invalid number for days, using defaults! error: {e}");
})
.unwrap_or(days_default)
});
info!("Days set to {days}",);
let blogs = time_func(|| download_blogs(days), "download_blogs");
let posts_amt = blogs.iter().flat_map(|x| &x.posts).count();
info!(
"Downloaded {} blogs with {} posts total.",
blogs.len(),
posts_amt
);
let html = map_to_html(&blogs);
if cfg!(debug_assertions) {
info!("{}", html);
} else {
let address = std::env::var("EMAIL_ADDRESS").expect("EMAIL_ADDRESS must be set.");
if let Err(e) = get_email_provider().map(|provider| provider.send_email(&address, &html))? {
error!("{}", e);
};
}
Ok(())
}
#[cfg(not(feature = "aws-lambda"))]
fn main() -> Result<(), String> {
core_main()
}
#[cfg(feature = "aws-lambda")]
fn main() -> Result<(), aws_lambda::LambdaErr> {
aws_lambda::lambda_wrapper()
}
#[cfg(feature = "aws-lambda")]
mod aws_lambda {
use crate::core_main;
use lambda_runtime::{run, service_fn, Error, LambdaEvent};
use rss2email_lib::warn;
use serde::Deserialize;
pub type LambdaErr = Error;
#[derive(Deserialize)]
struct Request {}
#[allow(clippy::unused_async)]
async fn function_handler(_event: LambdaEvent<Request>) -> Result<(), Error> {
let _res = core_main().map_err(|x| warn!("{}", x));
Ok(())
}
#[tokio::main]
pub async fn lambda_wrapper() -> Result<(), Error> {
tracing_subscriber::fmt()
.with_max_level(tracing::Level::INFO)
.with_target(false)
.without_time()
.init();
run(service_fn(function_handler)).await
}
}