use crate::deploy::outcomes::actions::bounded::FeeScale;
use crate::deploy::outcomes::actions::grant::{Grant, Permission};
use crate::deploy::outcomes::actions::instance::Instance;
use crate::deploy::outcomes::actions::settlement::Settlement;
use crate::utils::sign::{Map, Value};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Operation {
RegisterStandalone { instance: Instance, fee_scale: FeeScale },
RegisterQuestion { question: Instance, fee_scale: FeeScale, named: Vec<Instance> },
RegisterAndAssociate { question: u32, named: Instance },
SettleOutcome(Settlement),
SettleQuestion { question: u32, settlements: Vec<Settlement>, name: String, description: String },
SetSubDeployers(Vec<Grant>),
}
impl Operation {
#[must_use]
pub const fn wire_name(&self) -> &'static str {
match self {
Operation::RegisterStandalone { .. } => "registerStandaloneOutcomeFromTemplate",
Operation::RegisterQuestion { .. } => "registerQuestionFromTemplate",
Operation::RegisterAndAssociate { .. } => "registerAndAssociateNamedOutcomeFromTemplate",
Operation::SettleOutcome(_) => "settleOutcome",
Operation::SettleQuestion { .. } => "settleQuestion2",
Operation::SetSubDeployers(_) => "setSubDeployers",
}
}
#[must_use]
pub const fn permission(&self) -> Option<Permission> {
match self {
Operation::RegisterStandalone { .. } => Some(Permission::RegisterStandalone),
Operation::RegisterQuestion { .. } => Some(Permission::RegisterQuestion),
Operation::RegisterAndAssociate { .. } => Some(Permission::RegisterAndAssociate),
Operation::SettleOutcome(_) => Some(Permission::SettleOutcome),
Operation::SettleQuestion { .. } => Some(Permission::SettleQuestion),
Operation::SetSubDeployers(_) => None,
}
}
#[must_use]
pub const fn is_settlement(&self) -> bool {
matches!(self, Operation::SettleOutcome(_) | Operation::SettleQuestion { .. })
}
#[must_use]
pub fn body(&self) -> Value {
match self {
Operation::RegisterStandalone { instance, fee_scale } => instance.wire_with(*fee_scale).into(),
Operation::RegisterQuestion { question, fee_scale, named } => Map::new()
.put("questionTemplateInstance", question.wire_with(*fee_scale))
.put("namedOutcomeTemplateInstances", Value::array(named.iter().map(Instance::wire)))
.into(),
Operation::RegisterAndAssociate { question, named } => {
Map::new().put("question", *question).put("namedOutcomeTemplateInstance", named.wire()).into()
}
Operation::SettleOutcome(settlement) => settlement.wire().into(),
Operation::SettleQuestion { question, settlements, name, description } => Map::new()
.put("question", *question)
.put("outcomeSettlements", Value::array(settlements.iter().map(Settlement::wire)))
.put("nameAndDescription", Value::array([name.clone(), description.clone()]))
.into(),
Operation::SetSubDeployers(grants) => Value::array(grants.iter().map(Grant::wire)),
}
}
}
#[cfg(test)]
#[path = "tests/operation.rs"]
mod tests;