hdp_primitives/task/
mod.rs

1//! Task is a unit of work that can be executed by the processor/pre-processor.
2use crate::solidity_types::traits::DatalakeComputeCodecs;
3use alloy::primitives::B256;
4use cairo_lang_starknet_classes::casm_contract_class::CasmContractClass;
5use datalake::DatalakeCompute;
6use module::Module;
7
8pub mod datalake;
9pub mod module;
10
11/// [`TaskEnvelope`] is a structure that contains task itself
12/// This structure is used to provide the task to the pre-processor
13#[derive(Clone, Debug)]
14pub enum TaskEnvelope {
15    DatalakeCompute(DatalakeCompute),
16    Module(ExtendedModule),
17}
18
19#[derive(Clone, Debug)]
20pub struct ExtendedModule {
21    pub task: Module,
22    pub module_class: CasmContractClass,
23}
24
25impl TaskEnvelope {
26    pub fn commit(&self) -> B256 {
27        match self {
28            TaskEnvelope::DatalakeCompute(task) => task.commit(),
29            TaskEnvelope::Module(module) => module.task.commit(),
30        }
31    }
32
33    pub fn divide_tasks(tasks: Vec<TaskEnvelope>) -> (Vec<DatalakeCompute>, Vec<ExtendedModule>) {
34        // Partition the tasks into datalake and module tasks
35        let (datalake_envelopes, module_envelopes): (Vec<_>, Vec<_>) = tasks
36            .into_iter()
37            .partition(|task| matches!(task, TaskEnvelope::DatalakeCompute(_)));
38
39        let datalake_tasks = datalake_envelopes
40            .into_iter()
41            .filter_map(|task| {
42                if let TaskEnvelope::DatalakeCompute(datalake_task) = task {
43                    Some(datalake_task)
44                } else {
45                    None
46                }
47            })
48            .collect();
49
50        let module_tasks = module_envelopes
51            .into_iter()
52            .filter_map(|task| {
53                if let TaskEnvelope::Module(module_task) = task {
54                    Some(module_task)
55                } else {
56                    None
57                }
58            })
59            .collect();
60
61        (datalake_tasks, module_tasks)
62    }
63
64    pub fn variants() -> Vec<String> {
65        vec!["DATALAKE_COMPUTE", "MODULE"]
66            .into_iter()
67            .map(String::from)
68            .collect()
69    }
70}