1use rkyv::{Archive, Deserialize, Serialize};
2
3use crate::{
4 AbiParam, AbiScalarType, AbiScalarValue, AbiSignature, CallPlanError, GuestResourceId,
5};
6
7#[derive(Debug, Clone, PartialEq, Archive, Serialize, Deserialize)]
9#[rkyv(bytecheck())]
10pub enum EntrypointArg {
11 Scalar(AbiScalarValue),
13 Buffer(Vec<u8>),
15 Resource(GuestResourceId),
17}
18
19#[derive(Debug, Clone, PartialEq, Archive, Serialize, Deserialize)]
21#[rkyv(bytecheck())]
22pub struct EntrypointInvocation {
23 pub signature: AbiSignature,
25 pub args: Vec<EntrypointArg>,
27}
28
29impl EntrypointInvocation {
30 pub fn new(signature: AbiSignature, args: Vec<EntrypointArg>) -> Result<Self, CallPlanError> {
32 let invocation = Self { signature, args };
33 invocation.validate()?;
34 Ok(invocation)
35 }
36
37 pub fn validate(&self) -> Result<(), CallPlanError> {
39 if self.signature.params().len() != self.args.len() {
40 return Err(CallPlanError::ParameterCount {
41 expected: self.signature.params().len(),
42 actual: self.args.len(),
43 });
44 }
45
46 for (index, (param, arg)) in self
47 .signature
48 .params()
49 .iter()
50 .zip(self.args.iter())
51 .enumerate()
52 {
53 match (param, arg) {
54 (AbiParam::Scalar(expected), EntrypointArg::Scalar(actual)) => {
55 if actual.kind() != *expected {
56 return Err(CallPlanError::ValueMismatch {
57 index,
58 reason: "scalar type mismatch",
59 });
60 }
61 }
62 (AbiParam::Scalar(AbiScalarType::I32), EntrypointArg::Resource(_))
63 | (AbiParam::Scalar(AbiScalarType::U64), EntrypointArg::Resource(_)) => {}
64 (AbiParam::Buffer, EntrypointArg::Buffer(_)) => {}
65 _ => {
66 return Err(CallPlanError::ValueMismatch {
67 index,
68 reason: "argument incompatible with signature",
69 });
70 }
71 }
72 }
73
74 Ok(())
75 }
76
77 pub fn signature(&self) -> &AbiSignature {
79 &self.signature
80 }
81}
82
83#[derive(Debug, Clone, PartialEq, Archive, Serialize, Deserialize)]
85#[rkyv(bytecheck())]
86pub struct ProcessLogRegistration {
87 pub channel: GuestResourceId,
89}
90
91#[derive(Debug, Clone, PartialEq, Archive, Serialize, Deserialize)]
93#[rkyv(bytecheck())]
94pub struct ProcessLogLookup {
95 pub process_id: GuestResourceId,
97}
98
99#[derive(Debug, Clone, PartialEq, Archive, Serialize, Deserialize)]
101#[rkyv(bytecheck())]
102pub struct ProcessStart {
103 pub module_id: String,
105 pub name: String,
107 pub capabilities: Vec<crate::Capability>,
109 pub entrypoint: EntrypointInvocation,
111}