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 }