ic_backup/model/operation_plan/operation/
mod.rs1use super::{OperationPlanError, canonical_hash};
4use crate::model::attempt_journal::AttemptBudgetRecord;
5use serde::{Deserialize, Serialize};
6
7#[derive(Clone, Debug)]
9pub struct PlannedOperationRequest {
10 pub operation_sequence: u64,
12 pub target: String,
14 pub request: String,
16 pub budget: AttemptBudgetRecord,
18}
19#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
21#[serde(try_from = "OperationFields")]
22pub struct PlannedOperationRecord {
23 operation_sequence: u64,
24 target: String,
25 request: String,
26 budget: AttemptBudgetRecord,
27}
28#[derive(Deserialize)]
29#[serde(deny_unknown_fields)]
30struct OperationFields {
31 operation_sequence: u64,
32 target: String,
33 request: String,
34 budget: AttemptBudgetRecord,
35}
36impl TryFrom<OperationFields> for PlannedOperationRecord {
37 type Error = OperationPlanError;
38 fn try_from(fields: OperationFields) -> Result<Self, Self::Error> {
39 Self::new(PlannedOperationRequest {
40 operation_sequence: fields.operation_sequence,
41 target: fields.target,
42 request: fields.request,
43 budget: fields.budget,
44 })
45 }
46}
47impl PlannedOperationRecord {
48 pub fn new(request: PlannedOperationRequest) -> Result<Self, OperationPlanError> {
53 Ok(Self {
54 operation_sequence: request.operation_sequence,
55 target: crate::model::principal::canonical_text(&request.target)
56 .ok_or(OperationPlanError::InvalidPrincipal("target"))?,
57 request: canonical_hash(&request.request)?,
58 budget: request.budget,
59 })
60 }
61 #[must_use]
63 pub const fn operation_sequence(&self) -> u64 {
64 self.operation_sequence
65 }
66 #[must_use]
68 pub fn target(&self) -> &str {
69 &self.target
70 }
71 #[must_use]
73 pub fn request(&self) -> &str {
74 &self.request
75 }
76 #[must_use]
78 pub const fn budget(&self) -> &AttemptBudgetRecord {
79 &self.budget
80 }
81}