use lamedh_runtime::{handler_fn, run, Context, Error};
use serde::{Deserialize, Serialize};
use serde_json::{json, Value};
use std::fs::File;
#[derive(Deserialize)]
struct Request {
event_type: EventType,
}
#[derive(Deserialize, PartialEq)]
enum EventType {
Response,
ExternalError,
SimpleError,
CustomError,
Panic,
}
#[derive(Serialize)]
struct Response {
req_id: String,
msg: String,
}
#[derive(Debug, Serialize)]
struct CustomError {
is_authenticated: bool,
req_id: String,
msg: String,
}
impl std::error::Error for CustomError {
}
impl std::fmt::Display for CustomError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let err_as_json = json!(self).to_string();
write!(f, "{}", err_as_json)
}
}
#[tokio::main]
async fn main() -> Result<(), Error> {
tracing_subscriber::fmt()
.with_max_level(tracing::Level::INFO)
.with_ansi(false)
.without_time()
.init();
run(handler_fn(func)).await?;
Ok(())
}
pub(crate) async fn func(event: Value, ctx: Context) -> Result<Value, Error> {
match serde_json::from_value::<Request>(event)?.event_type {
EventType::SimpleError => {
return Err(Box::new(simple_error::SimpleError::new("A simple error as requested!")));
}
EventType::CustomError => {
let cust_err = CustomError {
is_authenticated: ctx.identity.is_some(),
req_id: ctx.request_id,
msg: "A custom error as requested!".into(),
};
return Err(Box::new(cust_err));
}
EventType::ExternalError => {
let _file = File::open("non-existent-file.txt")?;
unreachable!();
}
EventType::Panic => {
panic!();
}
EventType::Response => {
let resp = Response {
req_id: ctx.request_id,
msg: "OK".into(),
};
return Ok(json!(resp));
}
}
}