use std::{sync::Arc, time::Duration};
use futures::future::BoxFuture;
use miette::Result;
use crate::{alert::InternalContext, canopy::CanopyClient};
#[derive(Clone)]
pub struct TaskContext {
pub pg_pool: bestool_postgres::pool::PgPool,
pub http_client: reqwest::Client,
pub canopy_client: Option<Arc<CanopyClient>>,
}
impl TaskContext {
pub(crate) fn from_internal(ctx: &InternalContext) -> Self {
Self {
pg_pool: ctx.pg_pool.clone(),
http_client: ctx.http_client.clone(),
canopy_client: ctx.canopy_client.clone(),
}
}
}
pub trait BackgroundTask: Send + Sync + 'static {
fn name(&self) -> &'static str;
fn interval(&self) -> Duration;
fn run<'a>(&'a self, ctx: &'a TaskContext) -> BoxFuture<'a, Result<()>>;
}