field_ios

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

operation.rs (5761B)


      1 //! Scoped operation records never masquerade as legacy draft mutation inputs.
      2 
      3 use crate::{
      4     FfiComposerDraftRecord, FfiDraftMediaRecord, FfiOperationSettlementRecord, FfiOutboxState,
      5     FfiPreparedMediaInput, FfiSubmissionReservationRequest, MOBILE_FFI_SCHEMA_VERSION,
      6 };
      7 use tera_core::runtime::product_surface::{PublicationDeliveryState, SubmissionOperationStatus};
      8 
      9 #[derive(Clone, Copy, Debug, Eq, PartialEq, uniffi::Enum)]
     10 pub enum FfiPublicationDeliveryState {
     11     NotIssued,
     12     Unknown,
     13     PartiallyAccepted,
     14     Accepted,
     15 }
     16 
     17 #[derive(Clone, Debug, Eq, PartialEq, uniffi::Record)]
     18 pub struct FfiPublicationDeliveryEvidence {
     19     pub state: FfiPublicationDeliveryState,
     20     pub stop_requested_at_unix_ms: Option<u64>,
     21     pub scheduling_revision: u64,
     22     pub retained_facts: u32,
     23     pub recorded_attempts: u32,
     24     pub unresolved_claims: bool,
     25 }
     26 
     27 impl From<tera_core::runtime::product_surface::PublicationDeliveryEvidence>
     28     for FfiPublicationDeliveryEvidence
     29 {
     30     fn from(value: tera_core::runtime::product_surface::PublicationDeliveryEvidence) -> Self {
     31         Self {
     32             state: match value.state {
     33                 PublicationDeliveryState::NotIssued => FfiPublicationDeliveryState::NotIssued,
     34                 PublicationDeliveryState::Unknown => FfiPublicationDeliveryState::Unknown,
     35                 PublicationDeliveryState::PartiallyAccepted => {
     36                     FfiPublicationDeliveryState::PartiallyAccepted
     37                 }
     38                 PublicationDeliveryState::Accepted => FfiPublicationDeliveryState::Accepted,
     39             },
     40             stop_requested_at_unix_ms: value.stop_requested_at_unix_ms,
     41             scheduling_revision: value.scheduling_revision,
     42             retained_facts: value.retained_facts,
     43             recorded_attempts: value.recorded_attempts,
     44             unresolved_claims: value.unresolved_claims,
     45         }
     46     }
     47 }
     48 
     49 #[derive(Clone, Debug, Eq, PartialEq, uniffi::Record)]
     50 pub struct FfiSubmissionMediaRecord {
     51     pub opaque_reference: String,
     52     pub progress: FfiDraftMediaRecord,
     53     pub authorizations: Vec<FfiUploadAttemptIdentity>,
     54 }
     55 
     56 #[derive(Clone, Debug, Eq, PartialEq, uniffi::Record)]
     57 pub struct FfiUploadAttemptIdentity {
     58     pub operation_id: String,
     59     pub revision: Option<u64>,
     60     pub expiration_unix_s: u64,
     61 }
     62 
     63 #[derive(Clone, Eq, PartialEq, uniffi::Record)]
     64 pub struct FfiSubmissionOperationRecord {
     65     pub schema_version: u16,
     66     pub request: FfiSubmissionReservationRequest,
     67     pub intent_id: String,
     68     pub operation_id: String,
     69     pub revision: u64,
     70     pub captured: FfiComposerDraftRecord,
     71     pub state: FfiOutboxState,
     72     pub committed_at_unix_ms: u64,
     73     pub updated_at_unix_ms: u64,
     74     pub media: Vec<FfiSubmissionMediaRecord>,
     75     pub settlement: FfiOperationSettlementRecord,
     76     pub delivery: FfiPublicationDeliveryEvidence,
     77     pub target_details: super::FfiPublicationTargetDetails,
     78     pub retry: super::FfiPublicationRetryDecision,
     79 }
     80 
     81 impl std::fmt::Debug for FfiSubmissionOperationRecord {
     82     fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
     83         formatter
     84             .debug_struct("FfiSubmissionOperationRecord")
     85             .field("state", &self.state)
     86             .finish_non_exhaustive()
     87     }
     88 }
     89 
     90 impl From<&SubmissionOperationStatus> for FfiSubmissionOperationRecord {
     91     fn from(value: &SubmissionOperationStatus) -> Self {
     92         Self {
     93             schema_version: MOBILE_FFI_SCHEMA_VERSION,
     94             request: value.receipt().request().into(),
     95             intent_id: hex::encode(value.receipt().intent_id().as_bytes()),
     96             operation_id: hex::encode(value.receipt().operation_id().as_bytes()),
     97             revision: value.intent().revision().get(),
     98             captured: value.captured().into(),
     99             state: value.state().into(),
    100             committed_at_unix_ms: value.receipt().committed_at_unix_ms(),
    101             updated_at_unix_ms: value.intent().updated_at_unix_ms(),
    102             media: value
    103                 .media()
    104                 .iter()
    105                 .map(|media| FfiSubmissionMediaRecord {
    106                     opaque_reference: media.local_reference().to_owned(),
    107                     progress: media.into(),
    108                     authorizations: media
    109                         .upload_authorizations()
    110                         .into_iter()
    111                         .map(|value| FfiUploadAttemptIdentity {
    112                             operation_id: hex::encode(value.operation_id),
    113                             revision: value.revision,
    114                             expiration_unix_s: value.expiration_unix_s,
    115                         })
    116                         .collect(),
    117                 })
    118                 .collect(),
    119             settlement: value.push().settlement().into(),
    120             delivery: value.delivery_evidence().into(),
    121             target_details: value.target_details().into(),
    122             retry: value.retry_decision().into(),
    123         }
    124     }
    125 }
    126 
    127 #[derive(Clone, uniffi::Record)]
    128 pub struct FfiSubmissionMediaInput {
    129     pub schema_version: u16,
    130     pub request: FfiSubmissionReservationRequest,
    131     pub expected_revision: u64,
    132     pub media: FfiPreparedMediaInput,
    133 }
    134 
    135 #[derive(Clone, uniffi::Record)]
    136 pub struct FfiSubmissionUploadJobRecord {
    137     pub schema_version: u16,
    138     pub submission: FfiSubmissionOperationRecord,
    139     pub operation_id: String,
    140     pub remote_url: String,
    141     pub upload_url: String,
    142     pub authorization_header: String,
    143     pub expected_sha256: String,
    144     pub media_type: String,
    145     pub byte_size: u64,
    146 }
    147 
    148 #[derive(Clone, uniffi::Record)]
    149 pub struct FfiSubmissionUploadResponse {
    150     pub schema_version: u16,
    151     pub status_code: u16,
    152     pub media_type: Option<String>,
    153     pub content_encoding: Option<String>,
    154     pub body: Vec<u8>,
    155 }