runbot 0.0.3

QQ client framework
Documentation
use std::{fmt::Debug, sync::Arc};

use crate::{bot_context::BotContext, event};
use async_trait::async_trait;

#[derive(Debug)]
pub enum Processor {
    Post(Box<dyn PostProcessor>),
    Message(Box<dyn MessageProcessor>),
    Notice(Box<dyn NoticeProcessor>),
    Request(Box<dyn RequestProcessor>),
}

impl Processor {
    pub async fn process(
        &self,
        bot_ctx: Arc<BotContext>,
        post: &event::Post,
    ) -> anyhow::Result<bool> {
        if let (Processor::Message(processor), event::Post::Message(message)) = (self, post) {
            processor.process_message(bot_ctx, message).await
        } else if let (Processor::Notice(processor), event::Post::Notice(notice)) = (self, post) {
            processor.process_notice(bot_ctx, notice).await
        } else if let (Processor::Request(processor), event::Post::Request(request)) = (self, post) {
            processor.process_request(bot_ctx, request).await
        } else if let Processor::Post(processor) = self {
            processor.process_post(bot_ctx, post).await
        } else {
            Ok(false)
        }
    }
}

#[async_trait]
pub trait PostProcessor: Send + Sync + Debug {
    async fn process_post(
        &self,
        bot_ctx: Arc<BotContext>,
        post: &event::Post,
    ) -> anyhow::Result<bool>;
}

#[async_trait]
pub trait MessageProcessor: Send + Sync + Debug {
    async fn process_message(
        &self,
        bot_ctx: Arc<BotContext>,
        message: &event::Message,
    ) -> anyhow::Result<bool>;
}

#[async_trait]
pub trait NoticeProcessor: Send + Sync + Debug {
    async fn process_notice(
        &self,
        bot_ctx: Arc<BotContext>,
        event: &event::Notice,
    ) -> anyhow::Result<bool>;
}

#[async_trait]
pub trait RequestProcessor: Send + Sync + Debug {
    async fn process_request(
        &self,
        bot_ctx: Arc<BotContext>,
        request: &event::Request,
    ) -> anyhow::Result<bool>;
}

impl Into<Processor> for Box<dyn PostProcessor> {
    fn into(self) -> Processor {
        Processor::Post(self)
    }
}

impl Into<Processor> for Box<dyn MessageProcessor> {
    fn into(self) -> Processor {
        Processor::Message(self)
    }
}

impl Into<Processor> for Box<dyn NoticeProcessor> {
    fn into(self) -> Processor {
        Processor::Notice(self)
    }
}

impl Into<Processor> for Box<dyn RequestProcessor> {
    fn into(self) -> Processor {
        Processor::Request(self)
    }
}