Trait extism_pdk::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");

Required Associated Types§

source

type Bytes: AsRef<[u8]>

A configurable byte slice representation, allows any type that implements AsRef<[u8]>

Required Methods§

source

fn to_bytes(&self) -> Result<Self::Bytes, Error>

to_bytes converts a value into Self::Bytes

Implementations on Foreign Types§

source§

impl<'a> ToBytes<'a> for &'a str

§

type Bytes = &'a str

source§

fn to_bytes(&self) -> Result<<&'a str as ToBytes<'a>>::Bytes, Error>

source§

impl<'a> ToBytes<'a> for &'a [u8]

§

type Bytes = &'a [u8]

source§

fn to_bytes(&self) -> Result<<&'a [u8] as ToBytes<'a>>::Bytes, Error>

source§

impl<'a> ToBytes<'a> for Value

§

type Bytes = Vec<u8>

source§

fn to_bytes(&self) -> Result<<Value as ToBytes<'a>>::Bytes, Error>

source§

impl<'a> ToBytes<'a> for f32

§

type Bytes = [u8; 4]

source§

fn to_bytes(&self) -> Result<<f32 as ToBytes<'a>>::Bytes, Error>

source§

impl<'a> ToBytes<'a> for f64

§

type Bytes = [u8; 8]

source§

fn to_bytes(&self) -> Result<<f64 as ToBytes<'a>>::Bytes, Error>

source§

impl<'a> ToBytes<'a> for i32

§

type Bytes = [u8; 4]

source§

fn to_bytes(&self) -> Result<<i32 as ToBytes<'a>>::Bytes, Error>

source§

impl<'a> ToBytes<'a> for i64

§

type Bytes = [u8; 8]

source§

fn to_bytes(&self) -> Result<<i64 as ToBytes<'a>>::Bytes, Error>

source§

impl<'a> ToBytes<'a> for u32

§

type Bytes = [u8; 4]

source§

fn to_bytes(&self) -> Result<<u32 as ToBytes<'a>>::Bytes, Error>

source§

impl<'a> ToBytes<'a> for u64

§

type Bytes = [u8; 8]

source§

fn to_bytes(&self) -> Result<<u64 as ToBytes<'a>>::Bytes, Error>

source§

impl<'a> ToBytes<'a> for ()

§

type Bytes = [u8; 0]

source§

fn to_bytes(&self) -> Result<<() as ToBytes<'a>>::Bytes, Error>

source§

impl<'a> ToBytes<'a> for String

source§

impl<'a> ToBytes<'a> for Vec<u8>

§

type Bytes = Vec<u8>

source§

fn to_bytes(&self) -> Result<<Vec<u8> as ToBytes<'a>>::Bytes, Error>

source§

impl<'a, T> ToBytes<'a> for Option<T>
where T: ToBytes<'a>,

§

type Bytes = Vec<u8>

source§

fn to_bytes(&self) -> Result<<Option<T> as ToBytes<'a>>::Bytes, Error>

source§

impl<'a, T> ToBytes<'a> for &'a T
where T: ToBytes<'a>,

§

type Bytes = <T as ToBytes<'a>>::Bytes

source§

fn to_bytes(&self) -> Result<<&'a T as ToBytes<'a>>::Bytes, Error>

Implementors§

source§

impl<'a, T> ToBytes<'a> for Base64<T>
where T: AsRef<[u8]>,

source§

impl<'a, T> ToBytes<'a> for Json<T>
where T: Serialize,

§

type Bytes = Vec<u8>

source§

impl<'a, T> ToBytes<'a> for Msgpack<T>
where T: Serialize,

§

type Bytes = Vec<u8>

source§

impl<'a, T> ToBytes<'a> for Prost<T>
where T: Message,

§

type Bytes = Vec<u8>

source§

impl<'a, T> ToBytes<'a> for Raw<'a, T>
where T: Pod,

§

type Bytes = &'a [u8]