field_ios

In-the-field app for Radroots on iOS
git clone https://radroots.dev/git/field_ios.git
Log | Files | Refs | README | LICENSE

revision_status.rs (3962B)


      1 //! Current revision evidence and permitted local actions.
      2 use crate::{FfiDraftStatusRecord, FfiPublicationTargetDetails, MOBILE_FFI_SCHEMA_VERSION};
      3 use tera_core::runtime::product_surface::{
      4     Phase1RevisionBranchStatus, Phase1RevisionPhase, Phase1RevisionPolicy, Phase1RevisionStatus,
      5 };
      6 
      7 #[derive(Clone, Debug, Eq, PartialEq, uniffi::Record)]
      8 pub struct FfiRevisionTargetRecord {
      9     pub card_id: String,
     10     pub source_event_id: String,
     11     pub source_address: Option<String>,
     12     pub author_public_key: String,
     13 }
     14 
     15 #[derive(Clone, Debug, Eq, PartialEq, uniffi::Record)]
     16 pub struct FfiRevisionBranchRecord {
     17     pub stopped: bool,
     18     pub can_resume: bool,
     19     pub can_cancel: bool,
     20     pub targets: Option<FfiPublicationTargetDetails>,
     21 }
     22 
     23 impl From<&Phase1RevisionBranchStatus> for FfiRevisionBranchRecord {
     24     fn from(value: &Phase1RevisionBranchStatus) -> Self {
     25         Self {
     26             stopped: value.stopped,
     27             can_resume: value.can_resume,
     28             can_cancel: value.can_cancel,
     29             targets: value.targets.as_ref().map(Into::into),
     30         }
     31     }
     32 }
     33 
     34 #[derive(Clone, Copy, Debug, Eq, PartialEq, uniffi::Enum)]
     35 pub enum FfiRevisionPolicy {
     36     ReplaceThenRetract,
     37     AddressableReplacement,
     38 }
     39 
     40 #[derive(Clone, Copy, Debug, Eq, PartialEq, uniffi::Enum)]
     41 pub enum FfiRevisionPhase {
     42     ReplacementPending,
     43     ReplacementFailed,
     44     RetractionPending,
     45     Complete,
     46     PartialEffect,
     47     Cancelled,
     48 }
     49 
     50 #[derive(Clone, Debug, Eq, PartialEq, uniffi::Record)]
     51 pub struct FfiRevisionStatusRecord {
     52     pub schema_version: u16,
     53     pub operation_id: String,
     54     pub replacement: FfiDraftStatusRecord,
     55     pub retraction: Option<FfiDraftStatusRecord>,
     56     pub policy: FfiRevisionPolicy,
     57     pub phase: FfiRevisionPhase,
     58     pub original: FfiRevisionTargetRecord,
     59     pub replacement_progress: FfiRevisionBranchRecord,
     60     pub retraction_progress: Option<FfiRevisionBranchRecord>,
     61     pub can_resume: bool,
     62     pub can_cancel: bool,
     63 }
     64 
     65 impl From<Phase1RevisionStatus> for FfiRevisionStatusRecord {
     66     fn from(value: Phase1RevisionStatus) -> Self {
     67         let operation_id = hex::encode(value.replacement().draft().draft_id().as_bytes());
     68         let retraction = value.retraction().cloned().map(Into::into);
     69         let replacement = value.replacement().clone().into();
     70         Self {
     71             schema_version: MOBILE_FFI_SCHEMA_VERSION,
     72             operation_id,
     73             original: FfiRevisionTargetRecord {
     74                 card_id: value.target().card_id().to_hex(),
     75                 source_event_id: value.target().source_event_id().to_owned(),
     76                 source_address: value.target().source_address().map(str::to_owned),
     77                 author_public_key: hex::encode(value.replacement().draft().author()),
     78             },
     79             replacement_progress: value.replacement_progress().into(),
     80             retraction_progress: value.retraction_progress().map(Into::into),
     81             can_resume: value.can_resume(),
     82             can_cancel: value.can_cancel(),
     83             replacement,
     84             retraction,
     85             policy: match value.policy() {
     86                 Phase1RevisionPolicy::ReplaceThenRetract => FfiRevisionPolicy::ReplaceThenRetract,
     87                 Phase1RevisionPolicy::AddressableReplacement => {
     88                     FfiRevisionPolicy::AddressableReplacement
     89                 }
     90             },
     91             phase: match value.phase() {
     92                 Phase1RevisionPhase::ReplacementPending => FfiRevisionPhase::ReplacementPending,
     93                 Phase1RevisionPhase::ReplacementFailed => FfiRevisionPhase::ReplacementFailed,
     94                 Phase1RevisionPhase::RetractionPending => FfiRevisionPhase::RetractionPending,
     95                 Phase1RevisionPhase::Complete => FfiRevisionPhase::Complete,
     96                 Phase1RevisionPhase::PartialEffect => FfiRevisionPhase::PartialEffect,
     97                 Phase1RevisionPhase::Cancelled => FfiRevisionPhase::Cancelled,
     98             },
     99         }
    100     }
    101 }