app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

workflow.rs (2829B)


      1 use radroots_app_view::{
      2     OrderId, TradeAgreementStatus, TradeEconomicsProjection, TradeInventoryStatus,
      3     TradeProvenanceProjection, TradeRevisionStatus, TradeWorkflowProjection, TradeWorkflowSource,
      4 };
      5 
      6 use crate::AppSqliteError;
      7 
      8 #[derive(Clone, Debug, Eq, PartialEq)]
      9 pub(super) struct StoredTradeWorkflowSnapshot {
     10     pub order_id: OrderId,
     11     pub revision: TradeRevisionStatus,
     12     pub economics: TradeEconomicsProjection,
     13     pub agreement: String,
     14     pub inventory: String,
     15     pub provenance_source: String,
     16     pub provenance_last_event_id: Option<String>,
     17 }
     18 
     19 pub(super) fn trade_workflow_projection_from_storage(
     20     snapshot: StoredTradeWorkflowSnapshot,
     21 ) -> Result<TradeWorkflowProjection, AppSqliteError> {
     22     Ok(TradeWorkflowProjection {
     23         order_id: snapshot.order_id,
     24         agreement: parse_trade_agreement_status("orders.workflow_agreement", snapshot.agreement)?,
     25         revision: snapshot.revision,
     26         economics: snapshot.economics,
     27         inventory: parse_trade_inventory_status("orders.workflow_inventory", snapshot.inventory)?,
     28         provenance: TradeProvenanceProjection::from_primary_source(parse_trade_workflow_source(
     29             "orders.workflow_provenance_source",
     30             snapshot.provenance_source,
     31         )?)
     32         .with_last_event_id(snapshot.provenance_last_event_id),
     33     })
     34 }
     35 
     36 fn parse_trade_agreement_status(
     37     field: &'static str,
     38     value: String,
     39 ) -> Result<TradeAgreementStatus, AppSqliteError> {
     40     match value.as_str() {
     41         "ordered" => Ok(TradeAgreementStatus::Ordered),
     42         "confirmed" => Ok(TradeAgreementStatus::Confirmed),
     43         "declined" => Ok(TradeAgreementStatus::Declined),
     44         "cancelled" => Ok(TradeAgreementStatus::Cancelled),
     45         "needs_review" => Ok(TradeAgreementStatus::NeedsReview),
     46         _ => Err(AppSqliteError::DecodeEnum { field, value }),
     47     }
     48 }
     49 
     50 fn parse_trade_inventory_status(
     51     field: &'static str,
     52     value: String,
     53 ) -> Result<TradeInventoryStatus, AppSqliteError> {
     54     match value.as_str() {
     55         "available" => Ok(TradeInventoryStatus::Available),
     56         "reserved" => Ok(TradeInventoryStatus::Reserved),
     57         "sold_out" => Ok(TradeInventoryStatus::SoldOut),
     58         "needs_review" => Ok(TradeInventoryStatus::NeedsReview),
     59         _ => Err(AppSqliteError::DecodeEnum { field, value }),
     60     }
     61 }
     62 
     63 fn parse_trade_workflow_source(
     64     field: &'static str,
     65     value: String,
     66 ) -> Result<TradeWorkflowSource, AppSqliteError> {
     67     match value.as_str() {
     68         "app" => Ok(TradeWorkflowSource::App),
     69         "cli" => Ok(TradeWorkflowSource::Cli),
     70         "relay" => Ok(TradeWorkflowSource::Relay),
     71         "local_events" => Ok(TradeWorkflowSource::LocalEvents),
     72         "unknown" => Ok(TradeWorkflowSource::Unknown),
     73         _ => Err(AppSqliteError::DecodeEnum { field, value }),
     74     }
     75 }