use crate::core::ctx::Ctx;
use crate::core::engine::Engine;
use crate::middleware::SpawnerLayer;
use crate::types::{CapToken, TaskId};
use crate::worker::adapter::{SpawnError, SpawnerAdapter};
use crate::worker::Worker;
use async_trait::async_trait;
use serde_json::Value;
use std::sync::Arc;
pub const PROJECT_NAME_ALIAS_KEY: &str = "project_name_alias";
pub struct ProjectNameAliasMiddleware {
alias: String,
}
impl ProjectNameAliasMiddleware {
pub fn new(alias: impl Into<String>) -> Self {
Self {
alias: alias.into(),
}
}
}
impl SpawnerLayer for ProjectNameAliasMiddleware {
fn wrap(&self, inner: Arc<dyn SpawnerAdapter>) -> Arc<dyn SpawnerAdapter> {
Arc::new(ProjectNameAliasWrapped {
inner,
alias: self.alias.clone(),
})
}
}
struct ProjectNameAliasWrapped {
inner: Arc<dyn SpawnerAdapter>,
alias: String,
}
#[async_trait]
impl SpawnerAdapter for ProjectNameAliasWrapped {
async fn spawn(
&self,
engine: &Engine,
ctx: &Ctx,
task_id: TaskId,
attempt: u32,
token: CapToken,
) -> Result<Box<dyn Worker>, SpawnError> {
let mut new_ctx = ctx.clone();
new_ctx.meta.runtime.insert(
PROJECT_NAME_ALIAS_KEY.to_string(),
Value::String(self.alias.clone()),
);
self.inner
.spawn(engine, &new_ctx, task_id, attempt, token)
.await
}
}