onlyne-client 1.4.1

Onlyne v1 client: role runtime, dispatch, intent, adapter socket
Documentation
use crate::session::dispatch::{DispatchState, dispatch};
use anyhow::{Context, Result, anyhow};
use onlyne_proto::{Delivery, Envelope, Report};
use onlyne_session::{SessionBackend, SessionRef};
use onlyne_store::ClientStore;
use std::sync::Arc;

#[derive(Clone)]
pub struct AcceptPath {
    pub dispatch: DispatchState,
    pub prose: String,
}

impl AcceptPath {
    pub fn new(dispatch: DispatchState, prose: impl Into<String>) -> Self {
        Self {
            dispatch,
            prose: prose.into(),
        }
    }

    pub fn accept_new(&self, delivery: &Delivery, accept_new: bool) -> Result<Option<SessionRef>> {
        if !accept_new {
            return Ok(None);
        }
        delivery
            .envelope
            .validate()
            .map_err(|e| anyhow!(e.to_string()))?;
        let task_id = delivery
            .envelope
            .task_id()
            .context("delivery missing causality.task")?;
        let _ = task_id;
        Ok(Some(dispatch(&self.dispatch, &delivery.envelope)?))
    }

    pub fn ready_report(
        &self,
        task_id: &str,
        session_id: &str,
        generation: u64,
        seq: u64,
    ) -> Report {
        Report::Ready {
            task_id: task_id.into(),
            session_id: session_id.into(),
            generation,
            seq,
            cluster_ref: None,
        }
    }
}

pub fn validate_delivery(delivery: &Delivery) -> Result<&Envelope> {
    delivery
        .envelope
        .validate()
        .map_err(|e| anyhow!(e.to_string()))?;
    Ok(&delivery.envelope)
}

pub fn resolve_session(
    path: &AcceptPath,
    delivery: &Delivery,
    accept_new: bool,
) -> Result<Option<SessionRef>> {
    validate_delivery(delivery)?;
    path.accept_new(delivery, accept_new)
}

pub async fn acknowledge_completion(
    report: &Report,
    _store: &ClientStore,
) -> Result<Option<(String, onlyne_proto::Outcome)>> {
    match report {
        Report::Complete {
            task_id, outcome, ..
        } => Ok(Some((task_id.clone(), *outcome))),
        _ => Ok(None),
    }
}

pub fn backend_for_accept(backend: Arc<dyn SessionBackend>) -> Arc<dyn SessionBackend> {
    backend
}