macro_rules! define_hook {
($name:ident, $hook_name:expr, async |&$self:ident, $ctx:ident: &mut HookContext<$state:ty>, $event:ident: &LifecycleEvent| $body:block) => { ... };
}Expand description
Usage Example
use stakpak_shared::define_hook;
use stakpak_shared::hooks::{HookAction, HookContext, HookError, LifecycleEvent, Hook};
use chrono::{DateTime, Local};
use tokio::fs::OpenOptions;
use tokio::io::AsyncWriteExt;
use serde::Serialize;
use std::fmt::Debug;
#[derive(Debug, Clone, Serialize)]
pub struct State;
pub struct LoggerHook;
impl LoggerHook {
pub fn new() -> Self {
Self
}
}
define_hook!(
LoggerHook,
"logger",
async |&self, ctx: &mut HookContext<State>, event: &LifecycleEvent| {
let timestamp: DateTime<Local> = Local::now();
let log_message = format!(
"[{}] LoggerHook event: {:?}, {}\n",
timestamp.format("%Y-%m-%d %H:%M:%S%.3f"),
event,
serde_json::to_string(&ctx).unwrap_or_default(),
);
let mut file = OpenOptions::new()
.create(true)
.append(true)
.open("hook_events.log")
.await
.map_err(|e| HookError::ExecutionError(e.to_string()))?;
file.write_all(log_message.as_bytes())
.await
.map_err(|e| HookError::ExecutionError(e.to_string()))?;
Ok(HookAction::Continue)
}
);