1.1 KiB · text History 1ce9641
pub mod thumbnail;
pub mod ocr;
pub mod describe;
pub mod extract_tags;

use async_trait::async_trait;
use sea_orm::DatabaseConnection;
use std::sync::Arc;

use crate::queue::{JobHandler, JobMessage, JobOutcome};
use crate::storage::LocalStorage;
use crate::Config;

/// Shared worker context passed to every handler.
#[derive(Clone)]
pub struct WorkerContext {
    pub db: Arc<DatabaseConnection>,
    pub storage: Arc<LocalStorage>,
    pub config: Arc<Config>,
    pub amqp: Arc<lapin::Connection>,
}

impl WorkerContext {
    pub fn storage_abs(&self, relative: &str) -> std::path::PathBuf {
        use crate::storage::Storage;
        self.storage.absolute_path(relative)
    }
}

/// Adapter so per-kind worker functions can plug into the generic JobHandler.
pub struct DispatchHandler {
    pub ctx: WorkerContext,
    pub run: fn(WorkerContext, JobMessage) -> futures_util::future::BoxFuture<'static, JobOutcome>,
}

#[async_trait]
impl JobHandler for DispatchHandler {
    async fn handle(&self, msg: &JobMessage) -> JobOutcome {
        (self.run)(self.ctx.clone(), msg.clone()).await
    }
}