Skip to main content

define_hook

Macro define_hook 

Source
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)
    }
);