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 }