use crate::plugin::{
PluginHostImportDiscardReport, PluginHostImportError, PluginIdentity,
PluginInstanceAccessError, PluginOperationalEvent, PluginOperationalExport,
PluginOperationalImport, PluginOperationalRuntimeFailure, PluginRuntimeLimitField,
PluginWorkspaceObserveTaskEnqueueError, PluginWorkspaceObserveTaskQueueError,
SealedPluginWorkspaceObserveTaskBatch,
};
use std::fmt::{Debug, Display, Formatter};
#[derive(Clone, Copy, Eq, PartialEq)]
pub struct WasmtimePluginRuntimeFailure {
kind: WasmtimePluginRuntimeFailureKind,
}
impl WasmtimePluginRuntimeFailure {
#[must_use]
pub const fn kind(self) -> WasmtimePluginRuntimeFailureKind {
self.kind
}
pub(super) const fn new(kind: WasmtimePluginRuntimeFailureKind) -> Self {
Self { kind }
}
pub(super) const fn from_wasmtime<T>(
kind: WasmtimePluginRuntimeFailureKind,
_source: &T,
) -> Self {
Self::new(kind)
}
pub(super) const fn from_io(
kind: WasmtimePluginRuntimeFailureKind,
_source: &std::io::Error,
) -> Self {
Self::new(kind)
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum WasmtimePluginRuntimeFailureKind {
Engine,
RuntimeTimer,
Component,
Linker,
Instantiate,
Export,
Fuel,
GuestTrap,
PostReturn,
}
impl WasmtimePluginRuntimeFailureKind {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Engine => "engine",
Self::RuntimeTimer => "timer",
Self::Component => "component",
Self::Linker => "linker",
Self::Instantiate => "instantiate",
Self::Export => "export",
Self::Fuel => "fuel",
Self::GuestTrap => "guest trap",
Self::PostReturn => "post-return",
}
}
}
impl Display for WasmtimePluginRuntimeFailureKind {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
formatter.write_str(self.as_str())
}
}
impl Debug for WasmtimePluginRuntimeFailure {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
formatter
.debug_struct("WasmtimePluginRuntimeFailure")
.field("kind", &self.kind.as_str())
.finish()
}
}
impl Display for WasmtimePluginRuntimeFailure {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
formatter.write_str(self.kind.as_str())
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum WasmtimePluginRuntimePhase {
Engine,
Component,
Limit,
Instantiate,
Export,
Fuel,
Timer,
Timeout,
GuestTrap,
Scheduling,
UpdateSetup,
HostImport,
InstanceStateMismatch,
}
#[derive(Clone, Copy, Eq, PartialEq)]
#[non_exhaustive]
pub enum WasmtimeWorkspaceObserveTaskEnqueueErrorKind {
SchedulingDenied,
InstanceStateMismatch,
BatchIdentityMismatch,
Queue,
}
impl WasmtimeWorkspaceObserveTaskEnqueueErrorKind {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::SchedulingDenied => "scheduling-denied",
Self::InstanceStateMismatch => "instance-state-mismatch",
Self::BatchIdentityMismatch => "batch-identity-mismatch",
Self::Queue => "queue",
}
}
}
impl Display for WasmtimeWorkspaceObserveTaskEnqueueErrorKind {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
formatter.write_str(self.as_str())
}
}
impl Debug for WasmtimeWorkspaceObserveTaskEnqueueErrorKind {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
formatter.write_str(self.as_str())
}
}
#[derive(Eq, PartialEq, thiserror::Error)]
#[error("{source}")]
pub struct WasmtimeWorkspaceObserveTaskEnqueueError {
#[source]
source: WasmtimeWorkspaceObserveTaskEnqueueErrorSource,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct WasmtimeWorkspaceObserveTaskInstanceStateMismatchIdentities<'identity> {
pub runtime_identity: &'identity PluginIdentity,
pub state_identity: &'identity PluginIdentity,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct WasmtimeWorkspaceObserveTaskBatchIdentityMismatchIdentities<'identity> {
pub runtime_identity: &'identity PluginIdentity,
pub batch_identity: &'identity PluginIdentity,
}
#[derive(Debug, Eq, PartialEq, thiserror::Error)]
enum WasmtimeWorkspaceObserveTaskEnqueueErrorSource {
#[error("plugin workspace observe task enqueue denied: {source}")]
SchedulingDenied {
#[source]
source: PluginInstanceAccessError,
batch: SealedPluginWorkspaceObserveTaskBatch,
},
#[error("plugin workspace observe task enqueue denied by instance state mismatch")]
InstanceStateMismatch {
runtime_identity: PluginIdentity,
state_identity: PluginIdentity,
batch: SealedPluginWorkspaceObserveTaskBatch,
},
#[error("plugin workspace observe task enqueue denied by batch identity mismatch")]
BatchIdentityMismatch {
runtime_identity: PluginIdentity,
batch_identity: PluginIdentity,
batch: SealedPluginWorkspaceObserveTaskBatch,
},
#[error(transparent)]
Queue(#[from] PluginWorkspaceObserveTaskEnqueueError),
}
impl WasmtimeWorkspaceObserveTaskEnqueueError {
pub(super) const fn scheduling_denied(
source: PluginInstanceAccessError,
batch: SealedPluginWorkspaceObserveTaskBatch,
) -> Self {
Self {
source: WasmtimeWorkspaceObserveTaskEnqueueErrorSource::SchedulingDenied {
source,
batch,
},
}
}
pub(super) const fn instance_state_mismatch(
runtime_identity: PluginIdentity,
state_identity: PluginIdentity,
batch: SealedPluginWorkspaceObserveTaskBatch,
) -> Self {
Self {
source: WasmtimeWorkspaceObserveTaskEnqueueErrorSource::InstanceStateMismatch {
runtime_identity,
state_identity,
batch,
},
}
}
pub(super) const fn batch_identity_mismatch(
runtime_identity: PluginIdentity,
batch_identity: PluginIdentity,
batch: SealedPluginWorkspaceObserveTaskBatch,
) -> Self {
Self {
source: WasmtimeWorkspaceObserveTaskEnqueueErrorSource::BatchIdentityMismatch {
runtime_identity,
batch_identity,
batch,
},
}
}
pub(super) const fn from_queue(source: PluginWorkspaceObserveTaskEnqueueError) -> Self {
Self {
source: WasmtimeWorkspaceObserveTaskEnqueueErrorSource::Queue(source),
}
}
#[must_use]
pub const fn kind(&self) -> WasmtimeWorkspaceObserveTaskEnqueueErrorKind {
match &self.source {
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::SchedulingDenied { .. } => {
WasmtimeWorkspaceObserveTaskEnqueueErrorKind::SchedulingDenied
}
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::InstanceStateMismatch { .. } => {
WasmtimeWorkspaceObserveTaskEnqueueErrorKind::InstanceStateMismatch
}
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::BatchIdentityMismatch { .. } => {
WasmtimeWorkspaceObserveTaskEnqueueErrorKind::BatchIdentityMismatch
}
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::Queue(_) => {
WasmtimeWorkspaceObserveTaskEnqueueErrorKind::Queue
}
}
}
#[must_use]
pub const fn batch(&self) -> &SealedPluginWorkspaceObserveTaskBatch {
match &self.source {
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::SchedulingDenied { batch, .. }
| WasmtimeWorkspaceObserveTaskEnqueueErrorSource::InstanceStateMismatch {
batch, ..
}
| WasmtimeWorkspaceObserveTaskEnqueueErrorSource::BatchIdentityMismatch {
batch, ..
} => batch,
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::Queue(source) => source.batch(),
}
}
#[must_use]
pub const fn scheduling_error(&self) -> Option<&PluginInstanceAccessError> {
match &self.source {
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::SchedulingDenied { source, .. } => {
Some(source)
}
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::InstanceStateMismatch { .. }
| WasmtimeWorkspaceObserveTaskEnqueueErrorSource::BatchIdentityMismatch { .. }
| WasmtimeWorkspaceObserveTaskEnqueueErrorSource::Queue(_) => None,
}
}
#[must_use]
pub const fn instance_state_mismatch_identities(
&self,
) -> Option<WasmtimeWorkspaceObserveTaskInstanceStateMismatchIdentities<'_>> {
match &self.source {
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::InstanceStateMismatch {
runtime_identity,
state_identity,
..
} => Some(
WasmtimeWorkspaceObserveTaskInstanceStateMismatchIdentities {
runtime_identity,
state_identity,
},
),
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::SchedulingDenied { .. }
| WasmtimeWorkspaceObserveTaskEnqueueErrorSource::BatchIdentityMismatch { .. }
| WasmtimeWorkspaceObserveTaskEnqueueErrorSource::Queue(_) => None,
}
}
#[must_use]
pub const fn batch_identity_mismatch_identities(
&self,
) -> Option<WasmtimeWorkspaceObserveTaskBatchIdentityMismatchIdentities<'_>> {
match &self.source {
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::BatchIdentityMismatch {
runtime_identity,
batch_identity,
..
} => Some(
WasmtimeWorkspaceObserveTaskBatchIdentityMismatchIdentities {
runtime_identity,
batch_identity,
},
),
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::SchedulingDenied { .. }
| WasmtimeWorkspaceObserveTaskEnqueueErrorSource::InstanceStateMismatch { .. }
| WasmtimeWorkspaceObserveTaskEnqueueErrorSource::Queue(_) => None,
}
}
#[must_use]
pub const fn queue_error(&self) -> Option<&PluginWorkspaceObserveTaskQueueError> {
match &self.source {
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::Queue(source) => {
Some(source.queue_error())
}
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::SchedulingDenied { .. }
| WasmtimeWorkspaceObserveTaskEnqueueErrorSource::InstanceStateMismatch { .. }
| WasmtimeWorkspaceObserveTaskEnqueueErrorSource::BatchIdentityMismatch { .. } => None,
}
}
#[must_use]
pub fn operational_event(&self) -> Option<PluginOperationalEvent> {
match &self.source {
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::SchedulingDenied { .. } => None,
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::InstanceStateMismatch {
runtime_identity,
..
} => Some(PluginOperationalEvent::runtime_failure(
runtime_identity,
PluginOperationalRuntimeFailure::InstanceStateMismatch,
)),
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::BatchIdentityMismatch {
runtime_identity,
..
} => Some(PluginOperationalEvent::runtime_failure(
runtime_identity,
PluginOperationalRuntimeFailure::BatchIdentityMismatch,
)),
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::Queue(source) => {
source.queue_error().operational_event()
}
}
}
#[must_use]
pub fn into_batch(self) -> SealedPluginWorkspaceObserveTaskBatch {
match self.source {
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::SchedulingDenied { batch, .. }
| WasmtimeWorkspaceObserveTaskEnqueueErrorSource::InstanceStateMismatch {
batch, ..
}
| WasmtimeWorkspaceObserveTaskEnqueueErrorSource::BatchIdentityMismatch {
batch, ..
} => batch,
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::Queue(source) => source.into_batch(),
}
}
#[must_use]
pub fn discard_batch(self) -> crate::plugin::PluginWorkspaceObserveTaskDiscardReport {
self.into_batch().discard()
}
}
impl Debug for WasmtimeWorkspaceObserveTaskEnqueueError {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
let mut debug = formatter.debug_struct("WasmtimeWorkspaceObserveTaskEnqueueError");
let _debug = debug
.field("kind", &self.kind())
.field("batch_identity", self.batch().identity_proof())
.field("task_count", &self.batch().task_count());
match &self.source {
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::SchedulingDenied { source, .. } => {
let _debug = debug.field("scheduling_error", source);
}
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::InstanceStateMismatch {
runtime_identity,
state_identity,
..
} => {
let _debug = debug
.field("runtime_identity", runtime_identity)
.field("state_identity", state_identity);
}
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::BatchIdentityMismatch {
runtime_identity,
batch_identity,
..
} => {
let _debug = debug
.field("runtime_identity", runtime_identity)
.field("mismatched_batch_identity", batch_identity);
}
WasmtimeWorkspaceObserveTaskEnqueueErrorSource::Queue(source) => {
let _debug = debug.field("queue_error_kind", &source.queue_error().kind());
}
}
debug.finish()
}
}
#[derive(thiserror::Error)]
#[non_exhaustive]
pub enum WasmtimePluginRuntimeError {
Engine {
failure: WasmtimePluginRuntimeFailure,
},
Component {
identity: PluginIdentity,
byte_len: usize,
failure: WasmtimePluginRuntimeFailure,
},
Limit {
identity: PluginIdentity,
field: PluginRuntimeLimitField,
value: u64,
},
Instantiate {
identity: PluginIdentity,
failure: WasmtimePluginRuntimeFailure,
},
Export {
identity: PluginIdentity,
export: PluginOperationalExport,
failure: WasmtimePluginRuntimeFailure,
},
Fuel {
identity: PluginIdentity,
failure: WasmtimePluginRuntimeFailure,
},
Timer {
identity: PluginIdentity,
failure: WasmtimePluginRuntimeFailure,
},
RuntimeTimer {
failure: WasmtimePluginRuntimeFailure,
},
Timeout {
identity: PluginIdentity,
export: PluginOperationalExport,
timeout_ms: u64,
},
GuestTrap {
identity: PluginIdentity,
export: PluginOperationalExport,
failure: WasmtimePluginRuntimeFailure,
},
SchedulingDenied(#[source] crate::plugin::PluginInstanceAccessError),
UpdateSetup {
identity: PluginIdentity,
source: PluginHostImportError,
},
HostImport {
identity: PluginIdentity,
export: PluginOperationalExport,
import: PluginOperationalImport,
source: PluginHostImportError,
},
InstanceStateMismatch {
runtime_identity: PluginIdentity,
state_identity: PluginIdentity,
},
UpdateFailed {
source: Box<Self>,
discarded: PluginHostImportDiscardReport,
},
}
impl WasmtimePluginRuntimeError {
pub(super) fn with_discard(self, discarded: PluginHostImportDiscardReport) -> Self {
Self::UpdateFailed {
source: Box::new(self),
discarded,
}
}
#[must_use]
pub fn phase(&self) -> WasmtimePluginRuntimePhase {
match self {
Self::Engine { .. } => WasmtimePluginRuntimePhase::Engine,
Self::Component { .. } => WasmtimePluginRuntimePhase::Component,
Self::Limit { .. } => WasmtimePluginRuntimePhase::Limit,
Self::Instantiate { .. } => WasmtimePluginRuntimePhase::Instantiate,
Self::Export { .. } => WasmtimePluginRuntimePhase::Export,
Self::Fuel { .. } => WasmtimePluginRuntimePhase::Fuel,
Self::Timer { .. } | Self::RuntimeTimer { .. } => WasmtimePluginRuntimePhase::Timer,
Self::Timeout { .. } => WasmtimePluginRuntimePhase::Timeout,
Self::GuestTrap { .. } => WasmtimePluginRuntimePhase::GuestTrap,
Self::SchedulingDenied(_) => WasmtimePluginRuntimePhase::Scheduling,
Self::UpdateSetup { .. } => WasmtimePluginRuntimePhase::UpdateSetup,
Self::HostImport { .. } => WasmtimePluginRuntimePhase::HostImport,
Self::InstanceStateMismatch { .. } => WasmtimePluginRuntimePhase::InstanceStateMismatch,
Self::UpdateFailed { source, .. } => source.phase(),
}
}
#[must_use]
pub const fn discarded_update(&self) -> Option<&PluginHostImportDiscardReport> {
match self {
Self::UpdateFailed { discarded, .. } => Some(discarded),
_other => None,
}
}
#[must_use]
pub fn operational_event(&self) -> Option<PluginOperationalEvent> {
match self {
Self::Timeout {
identity,
timeout_ms,
..
} => Some(PluginOperationalEvent::timeout(identity, *timeout_ms)),
Self::UpdateSetup { identity, source } => Some(host_import_operational_event(
identity,
PluginOperationalImport::HostImport,
source,
)),
Self::HostImport {
identity,
import,
source,
..
} => Some(host_import_operational_event(identity, *import, source)),
Self::GuestTrap {
identity,
export,
failure,
} => match operational_failure_from_runtime_failure(failure.kind()) {
PluginOperationalRuntimeFailure::Export => {
Some(PluginOperationalEvent::guest_trap(identity, *export))
}
failure => Some(PluginOperationalEvent::runtime_failure(identity, failure)),
},
Self::UpdateFailed { source, .. } => source.operational_event(),
Self::Engine { .. } => Some(PluginOperationalEvent::unscoped_runtime_failure(
PluginOperationalRuntimeFailure::Engine,
)),
Self::RuntimeTimer { .. } => Some(PluginOperationalEvent::unscoped_runtime_failure(
PluginOperationalRuntimeFailure::RuntimeTimer,
)),
Self::Component { identity, .. } => Some(PluginOperationalEvent::runtime_failure(
identity,
PluginOperationalRuntimeFailure::Component,
)),
Self::Limit { identity, .. } => Some(PluginOperationalEvent::runtime_failure(
identity,
PluginOperationalRuntimeFailure::Limit,
)),
Self::Instantiate {
identity, failure, ..
} => Some(PluginOperationalEvent::runtime_failure(
identity,
operational_failure_from_runtime_failure(failure.kind()),
)),
Self::Export { identity, .. } => Some(PluginOperationalEvent::runtime_failure(
identity,
PluginOperationalRuntimeFailure::Export,
)),
Self::Fuel { identity, .. } => Some(PluginOperationalEvent::runtime_failure(
identity,
PluginOperationalRuntimeFailure::Fuel,
)),
Self::Timer { identity, .. } => Some(PluginOperationalEvent::runtime_failure(
identity,
PluginOperationalRuntimeFailure::Timer,
)),
Self::InstanceStateMismatch {
runtime_identity, ..
} => Some(PluginOperationalEvent::runtime_failure(
runtime_identity,
PluginOperationalRuntimeFailure::InstanceStateMismatch,
)),
Self::SchedulingDenied(_) => None,
}
}
}
impl Debug for WasmtimePluginRuntimeError {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
let mut debug = formatter.debug_struct("WasmtimePluginRuntimeError");
let _debug = debug.field("phase", &self.phase());
match self {
Self::Engine { failure } | Self::RuntimeTimer { failure } => {
let _debug = debug.field("failure", failure);
}
Self::Component {
identity,
byte_len,
failure,
} => {
let _debug = debug.field("identity", identity);
let _debug = debug.field("byte_len", byte_len);
let _debug = debug.field("failure", failure);
}
Self::Limit {
identity,
field,
value,
} => {
let _debug = debug.field("identity", identity);
let _debug = debug.field("field", field);
let _debug = debug.field("value", value);
}
Self::Instantiate { identity, failure }
| Self::Fuel { identity, failure }
| Self::Timer { identity, failure } => {
let _debug = debug.field("identity", identity);
let _debug = debug.field("failure", failure);
}
Self::Export {
identity,
export,
failure,
}
| Self::GuestTrap {
identity,
export,
failure,
} => {
let _debug = debug.field("identity", identity);
let _debug = debug.field("export", export);
let _debug = debug.field("failure", failure);
}
Self::Timeout {
identity,
export,
timeout_ms,
} => {
let _debug = debug.field("identity", identity);
let _debug = debug.field("export", export);
let _debug = debug.field("timeout_ms", timeout_ms);
}
Self::SchedulingDenied(source) => {
let _debug = debug.field("source", source);
}
Self::UpdateSetup { identity, source } => {
let _debug = debug.field("identity", identity);
let _debug = debug.field("source", source);
}
Self::HostImport {
identity,
export,
import,
source,
} => {
let _debug = debug.field("identity", identity);
let _debug = debug.field("export", export);
let _debug = debug.field("import", import);
let _debug = debug.field("source", source);
}
Self::InstanceStateMismatch {
runtime_identity,
state_identity,
} => {
let _debug = debug.field("runtime_identity", runtime_identity);
let _debug = debug.field("state_identity", state_identity);
}
Self::UpdateFailed { source, discarded } => {
let _debug = debug.field("source", source);
let _debug = debug.field("discarded", discarded);
}
}
debug.finish()
}
}
impl Display for WasmtimePluginRuntimeError {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Self::Engine { .. } => {
formatter.write_str("plugin Wasmtime engine initialization failed")
}
Self::Component {
identity, byte_len, ..
} => fmt_component_validation_error(formatter, identity, *byte_len),
Self::Limit {
identity,
field,
value,
} => fmt_limit_error(formatter, identity, *field, *value),
Self::Instantiate { identity, .. } => {
write!(
formatter,
"plugin {:?} component instantiation failed",
identity.as_str()
)
}
Self::Export {
identity, export, ..
} => {
write!(
formatter,
"plugin {:?} export {export} is not callable",
identity.as_str()
)
}
Self::Fuel { identity, .. } => write!(
formatter,
"plugin {:?} fuel setup failed",
identity.as_str()
),
Self::Timer { identity, .. } => write!(
formatter,
"plugin {:?} timeout setup failed",
identity.as_str()
),
Self::RuntimeTimer { .. } => {
formatter.write_str("plugin Wasmtime timeout driver setup failed")
}
Self::Timeout {
identity,
export,
timeout_ms,
} => {
write!(
formatter,
"plugin {:?} export {export} exceeded {timeout_ms} ms",
identity.as_str()
)
}
Self::GuestTrap {
identity, export, ..
} => write!(
formatter,
"plugin {:?} export {export} trapped",
identity.as_str()
),
Self::SchedulingDenied(source) => {
write!(formatter, "plugin scheduling denied: {source}")
}
Self::UpdateSetup { identity, source } => {
write!(
formatter,
"plugin {:?} update setup failed: {source}",
identity.as_str()
)
}
Self::HostImport {
identity,
export,
import,
source,
} => {
write!(
formatter,
"plugin {:?} export {export} host import {import} failed: {source}",
identity.as_str()
)
}
Self::InstanceStateMismatch {
runtime_identity,
state_identity,
} => fmt_instance_state_mismatch(formatter, runtime_identity, state_identity),
Self::UpdateFailed { source, discarded } => write!(
formatter,
"plugin update failed: {source}; discarded {} effects, {} workspace requests, and {} workspace observe tasks",
discarded.effects().discarded_effects(),
discarded.workspace_io().discarded_requests(),
discarded.workspace_observe_tasks().discarded_tasks()
),
}
}
}
fn fmt_component_validation_error(
formatter: &mut Formatter<'_>,
identity: &PluginIdentity,
byte_len: usize,
) -> std::fmt::Result {
write!(
formatter,
"plugin {:?} component validation failed for {byte_len} bytes",
identity.as_str()
)
}
fn fmt_limit_error(
formatter: &mut Formatter<'_>,
identity: &PluginIdentity,
field: PluginRuntimeLimitField,
value: u64,
) -> std::fmt::Result {
write!(
formatter,
"plugin {:?} runtime limit {field} value {value} does not fit host",
identity.as_str()
)
}
fn fmt_instance_state_mismatch(
formatter: &mut Formatter<'_>,
runtime_identity: &PluginIdentity,
state_identity: &PluginIdentity,
) -> std::fmt::Result {
write!(
formatter,
"plugin runtime {:?} cannot use state for {:?}",
runtime_identity.as_str(),
state_identity.as_str()
)
}
fn host_import_operational_event(
identity: &PluginIdentity,
import: PluginOperationalImport,
source: &PluginHostImportError,
) -> PluginOperationalEvent {
source.operational_rejection().map_or_else(
|| PluginOperationalEvent::denied_import(identity, import),
|reason| PluginOperationalEvent::rejected_import(identity, import, reason),
)
}
const fn operational_failure_from_runtime_failure(
failure: WasmtimePluginRuntimeFailureKind,
) -> PluginOperationalRuntimeFailure {
match failure {
WasmtimePluginRuntimeFailureKind::Engine => PluginOperationalRuntimeFailure::Engine,
WasmtimePluginRuntimeFailureKind::RuntimeTimer => {
PluginOperationalRuntimeFailure::RuntimeTimer
}
WasmtimePluginRuntimeFailureKind::Component => PluginOperationalRuntimeFailure::Component,
WasmtimePluginRuntimeFailureKind::Linker => PluginOperationalRuntimeFailure::Linker,
WasmtimePluginRuntimeFailureKind::Instantiate => {
PluginOperationalRuntimeFailure::Instantiate
}
WasmtimePluginRuntimeFailureKind::Export | WasmtimePluginRuntimeFailureKind::GuestTrap => {
PluginOperationalRuntimeFailure::Export
}
WasmtimePluginRuntimeFailureKind::PostReturn => PluginOperationalRuntimeFailure::PostReturn,
WasmtimePluginRuntimeFailureKind::Fuel => PluginOperationalRuntimeFailure::Fuel,
}
}