use alloc::vec::Vec;
use core::marker::PhantomData;
use crate::allocation::{AllocationContext, AllocationError};
use crate::inspect::PayloadView;
use crate::program::ReturnOutputView;
use crate::rule::{self, Rule};
use crate::trace::RuntimeStateView;
#[derive(Debug, PartialEq, Eq)]
pub(crate) enum RuntimeStateSnapshotDomain {}
#[derive(Debug, PartialEq, Eq)]
pub(crate) enum ReturnOutputDomain {}
#[derive(Debug, PartialEq, Eq)]
pub(crate) enum PayloadInspectionDomain {}
#[derive(Debug, PartialEq, Eq)]
pub(crate) enum CanonicalRuleSourceDomain {}
#[derive(Debug, PartialEq, Eq)]
pub(crate) enum OwnedRuleWitnessPayloadDomain {}
#[derive(Debug, PartialEq, Eq)]
pub(crate) struct MaterializedBytes<Domain> {
bytes: Vec<u8>,
domain: PhantomData<fn() -> Domain>,
}
impl<Domain> MaterializedBytes<Domain> {
fn from_owned_bytes(bytes: Vec<u8>) -> Self {
Self {
bytes,
domain: PhantomData,
}
}
pub(crate) fn as_slice(&self) -> &[u8] {
&self.bytes
}
pub(crate) fn into_raw_bytes(self) -> Vec<u8> {
self.bytes
}
pub(crate) fn len(&self) -> usize {
self.bytes.len()
}
pub(crate) const fn is_empty(&self) -> bool {
self.bytes.is_empty()
}
}
impl MaterializedBytes<PayloadInspectionDomain> {
pub(crate) fn from_payload_view(payload: PayloadView<'_>) -> Result<Self, AllocationError> {
Ok(Self::from_owned_bytes(
payload.to_vec_with_context(AllocationContext::PayloadView)?,
))
}
}
impl MaterializedBytes<CanonicalRuleSourceDomain> {
pub(crate) fn from_rule(rule: &Rule) -> Result<Self, AllocationError> {
Ok(Self::from_owned_bytes(rule::canonical_source(rule)?))
}
}
impl MaterializedBytes<OwnedRuleWitnessPayloadDomain> {
pub(crate) fn from_owned_rule_payload(
payload: PayloadView<'_>,
) -> Result<Self, AllocationError> {
Ok(Self::from_owned_bytes(payload.to_vec_with_context(
AllocationContext::OwnedRuleWitness,
)?))
}
}
impl MaterializedBytes<RuntimeStateSnapshotDomain> {
pub(crate) fn from_runtime_state_view(
state: RuntimeStateView<'_>,
) -> Result<Self, AllocationError> {
Ok(Self::from_owned_bytes(state.to_vec_with_context(
AllocationContext::RuntimeStateView,
)?))
}
pub(crate) fn from_final_state_view(
state: RuntimeStateView<'_>,
) -> Result<Self, AllocationError> {
Ok(Self::from_owned_bytes(
state.to_vec_with_context(AllocationContext::FinalOutput)?,
))
}
pub(crate) fn from_trace_state_view(
state: RuntimeStateView<'_>,
) -> Result<Self, AllocationError> {
Ok(Self::from_owned_bytes(
state.to_vec_with_context(AllocationContext::TraceSnapshot)?,
))
}
}
impl MaterializedBytes<ReturnOutputDomain> {
pub(crate) fn from_return_output_view(
output: ReturnOutputView<'_>,
) -> Result<Self, AllocationError> {
Ok(Self::from_owned_bytes(
output.to_vec_with_context(AllocationContext::ReturnOutput)?,
))
}
pub(crate) fn from_trace_return_output_view(
output: ReturnOutputView<'_>,
) -> Result<Self, AllocationError> {
Ok(Self::from_owned_bytes(
output.to_vec_with_context(AllocationContext::TraceSnapshot)?,
))
}
}