1use crate::{prelude::fmt, BlockDescriptor, BlockResult, BlockRuntime};
4
5pub type BlockID = usize;
9
10pub trait Block: AsBlock + BlockDescriptor + BlockHooks + Send + Sync {
12 fn prepare(&mut self, _runtime: &dyn BlockRuntime) -> BlockResult {
17 Ok(())
18 }
19
20 fn execute(&mut self, runtime: &dyn BlockRuntime) -> BlockResult;
22}
23
24#[doc(hidden)]
26pub trait BlockHooks {
27 fn pre_execute(&mut self, _runtime: &dyn BlockRuntime) -> BlockResult {
28 Ok(()) }
30
31 fn post_execute(&mut self, _runtime: &dyn BlockRuntime) -> BlockResult {
32 Ok(()) }
34}
35
36pub trait AsBlock {
37 fn as_block(&self) -> &dyn Block;
38}
39
40impl<T: Block + Sized> AsBlock for T {
41 fn as_block(&self) -> &dyn Block {
42 self
43 }
44}
45
46impl fmt::Debug for dyn Block {
47 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
48 f.debug_struct("Block")
49 .field("inputs", &self.inputs())
52 .field("outputs", &self.outputs())
53 .field("parameters", &self.parameters())
54 .finish()
55 }
56}