use freenet_stdlib::prelude::{RelatedContracts, UpdateData, UpdateModification, ValidateResult};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum OracleErrorKind {
Contract,
Resource,
Runtime,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OracleError {
pub kind: OracleErrorKind,
pub message: String,
}
impl OracleError {
pub fn contract(message: impl Into<String>) -> Self {
Self {
kind: OracleErrorKind::Contract,
message: message.into(),
}
}
pub fn resource(message: impl Into<String>) -> Self {
Self {
kind: OracleErrorKind::Resource,
message: message.into(),
}
}
pub fn runtime(message: impl Into<String>) -> Self {
Self {
kind: OracleErrorKind::Runtime,
message: message.into(),
}
}
}
impl std::fmt::Display for OracleError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}: {}", self.kind, self.message)
}
}
impl std::error::Error for OracleError {}
pub trait ConformanceOracle {
fn validate_state(
&mut self,
state: &[u8],
related: &RelatedContracts<'_>,
) -> Result<ValidateResult, OracleError>;
fn update_state(
&mut self,
state: &[u8],
updates: &[UpdateData<'_>],
) -> Result<UpdateModification<'static>, OracleError>;
fn summarize_state(&mut self, state: &[u8]) -> Result<Vec<u8>, OracleError>;
fn get_state_delta(&mut self, state: &[u8], summary: &[u8]) -> Result<Vec<u8>, OracleError>;
fn reset_instance(&mut self) {}
}