Trait extism_convert::ToBytes
source · pub trait ToBytes<'a> {
type Bytes: AsRef<[u8]>;
// Required method
fn to_bytes(&self) -> Result<Self::Bytes, Error>;
}
Expand description
ToBytes
is used to define how a type should be encoded when working with
Extism memory. It is used for plugin input and host function output.
ToBytes
can be derived by delegating encoding to generic type implementing
ToBytes
, e.g., Json
, Msgpack
.
use extism_convert::{Json, ToBytes};
use serde::Serialize;
#[derive(ToBytes, Serialize)]
#[encoding(Json)]
struct Struct {
hello: String,
}
assert_eq!(Struct { hello: "hi".into() }.to_bytes()?, br#"{"hello":"hi"}"#);
But custom types can also be used, as long as they are new-types with a single
generic argument, i.e., Type<T>(T)
, that implement ToBytes
for the struct.
use extism_convert::{Error, ToBytes};
// Custom serialization using `ToString`
struct StringEnc<T>(T);
impl<T: ToString> ToBytes<'_> for StringEnc<&T> {
type Bytes = String;
fn to_bytes(&self) -> Result<String, Error> {
Ok(self.0.to_string())
}
}
#[derive(ToBytes)]
#[encoding(StringEnc)]
struct Struct {
hello: String,
}
impl ToString for Struct {
fn to_string(&self) -> String {
self.hello.clone()
}
}
assert_eq!(Struct { hello: "hi".into() }.to_bytes()?, b"hi");