linera_witty/wit_generation/
stub_instance.rs

1// Copyright (c) Zefchain Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4//! Contains a [`StubInstance`] type and the code it requires to implement the necessary
5//! trait to be used as a Wasm instance type during compile time.
6
7use std::{borrow::Cow, marker::PhantomData};
8
9use crate::{
10    memory_layout::FlatLayout, GuestPointer, Instance, InstanceWithFunction, InstanceWithMemory,
11    Runtime, RuntimeError, RuntimeMemory,
12};
13
14/// A stub Wasm instance.
15///
16/// This is when a Wasm instance type is needed for type-checking but is not needed during
17/// runtime.
18pub struct StubInstance<UserData = ()> {
19    _user_data: PhantomData<UserData>,
20}
21
22impl<UserData> Default for StubInstance<UserData> {
23    fn default() -> Self {
24        StubInstance {
25            _user_data: PhantomData,
26        }
27    }
28}
29
30impl<UserData> Instance for StubInstance<UserData> {
31    type Runtime = StubRuntime;
32    type UserData = UserData;
33    type UserDataReference<'a>
34        = &'a UserData
35    where
36        Self::UserData: 'a,
37        Self: 'a;
38    type UserDataMutReference<'a>
39        = &'a mut UserData
40    where
41        Self::UserData: 'a,
42        Self: 'a;
43
44    fn load_export(&mut self, _name: &str) -> Option<()> {
45        unimplemented!("`StubInstance` can not be used as a real `Instance`");
46    }
47
48    fn user_data(&self) -> Self::UserDataReference<'_> {
49        unimplemented!("`StubInstance` can not be used as a real `Instance`");
50    }
51
52    fn user_data_mut(&mut self) -> Self::UserDataMutReference<'_> {
53        unimplemented!("`StubInstance` can not be used as a real `Instance`");
54    }
55}
56
57impl<Parameters, Results, UserData> InstanceWithFunction<Parameters, Results>
58    for StubInstance<UserData>
59where
60    Parameters: FlatLayout + 'static,
61    Results: FlatLayout + 'static,
62{
63    type Function = ();
64
65    fn function_from_export(
66        &mut self,
67        _name: <Self::Runtime as Runtime>::Export,
68    ) -> Result<Option<Self::Function>, RuntimeError> {
69        unimplemented!("`StubInstance` can not be used as a real `InstanceWithFunction`");
70    }
71
72    fn call(
73        &mut self,
74        _function: &Self::Function,
75        _parameters: Parameters,
76    ) -> Result<Results, RuntimeError> {
77        unimplemented!("`StubInstance` can not be used as a real `InstanceWithFunction`");
78    }
79}
80
81impl<UserData> InstanceWithMemory for StubInstance<UserData> {
82    fn memory_from_export(&self, _export: ()) -> Result<Option<StubMemory>, RuntimeError> {
83        unimplemented!("`StubInstance` can not be used as a real `InstanceWithMemory`");
84    }
85}
86
87/// A stub Wasm runtime.
88pub struct StubRuntime;
89
90impl Runtime for StubRuntime {
91    type Export = ();
92    type Memory = StubMemory;
93}
94
95/// A stub Wasm runtime memory.
96pub struct StubMemory;
97
98impl<UserData> RuntimeMemory<StubInstance<UserData>> for StubMemory {
99    fn read<'instance>(
100        &self,
101        _instance: &'instance StubInstance<UserData>,
102        _location: GuestPointer,
103        _length: u32,
104    ) -> Result<Cow<'instance, [u8]>, RuntimeError> {
105        unimplemented!("`StubMemory` can not be used as a real `RuntimeMemory`");
106    }
107
108    fn write(
109        &mut self,
110        _instance: &mut StubInstance<UserData>,
111        _location: GuestPointer,
112        _bytes: &[u8],
113    ) -> Result<(), RuntimeError> {
114        unimplemented!("`StubMemory` can not be used as a real `RuntimeMemory`");
115    }
116}