oura 2.2.0

The tail of Cardano
Documentation
use gasket::framework::*;
use pallas::network::miniprotocols::Point;
use serde::Deserialize;

use crate::framework::*;

#[derive(Default)]
pub struct Worker {}

#[async_trait::async_trait(?Send)]
impl gasket::framework::Worker<Stage> for Worker {
    async fn bootstrap(_: &Stage) -> Result<Self, WorkerError> {
        Ok(Default::default())
    }

    async fn schedule(&mut self, stage: &mut Stage) -> Result<WorkSchedule<Point>, WorkerError> {
        let msg = stage.track.recv().await.or_panic()?;
        Ok(WorkSchedule::Unit(msg.payload))
    }

    async fn execute(&mut self, unit: &Point, stage: &mut Stage) -> Result<(), WorkerError> {
        stage.breadcrumbs.track(unit.clone());
        Ok(())
    }
}

#[derive(Stage)]
#[stage(name = "cursor", unit = "Point", worker = "Worker")]
pub struct Stage {
    breadcrumbs: Breadcrumbs,

    pub track: gasket::messaging::InputPort<Point>,

    #[metric]
    tracked_slot: gasket::metrics::Gauge,
}

#[derive(Default, Debug, Deserialize)]
pub struct Config;

impl Config {
    pub fn initial_load(&self) -> Result<Breadcrumbs, Error> {
        Ok(Breadcrumbs::new(30))
    }

    pub fn bootstrapper(self, ctx: &Context) -> Result<Stage, Error> {
        let stage = Stage {
            breadcrumbs: ctx.breadcrumbs.clone(),
            tracked_slot: Default::default(),
            track: Default::default(),
        };

        Ok(stage)
    }
}