use super::OperationPlanError;
use crate::model::artifacts::canonical_hash;
use crate::model::attempt_journal::AttemptBudgetRecord;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug)]
pub struct PlannedOperationRequest {
pub operation_sequence: u64,
pub target: String,
pub request: String,
pub budget: AttemptBudgetRecord,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
#[serde(try_from = "OperationFields")]
pub struct PlannedOperationRecord {
operation_sequence: u64,
target: String,
request: String,
budget: AttemptBudgetRecord,
}
#[derive(Deserialize)]
#[serde(deny_unknown_fields)]
struct OperationFields {
operation_sequence: u64,
target: String,
request: String,
budget: AttemptBudgetRecord,
}
impl TryFrom<OperationFields> for PlannedOperationRecord {
type Error = OperationPlanError;
fn try_from(fields: OperationFields) -> Result<Self, Self::Error> {
Self::new(PlannedOperationRequest {
operation_sequence: fields.operation_sequence,
target: fields.target,
request: fields.request,
budget: fields.budget,
})
}
}
impl PlannedOperationRecord {
pub fn new(request: PlannedOperationRequest) -> Result<Self, OperationPlanError> {
Ok(Self {
operation_sequence: request.operation_sequence,
target: crate::model::principal::canonical_text(&request.target)
.ok_or(OperationPlanError::InvalidPrincipal("target"))?,
request: canonical_hash(&request.request)?,
budget: request.budget,
})
}
#[must_use]
pub const fn operation_sequence(&self) -> u64 {
self.operation_sequence
}
#[must_use]
pub fn target(&self) -> &str {
&self.target
}
#[must_use]
pub fn request(&self) -> &str {
&self.request
}
#[must_use]
pub const fn budget(&self) -> &AttemptBudgetRecord {
&self.budget
}
}