#casper #derive #boilerplate #contracts #type #byte #cl-typed

macro casper_types_derive

Use struct types in Casper contracts without boilerplate

1 unstable release

0.1.0 Apr 13, 2021

#20 in #casper

Download history 68/week @ 2024-03-15 79/week @ 2024-03-22 124/week @ 2024-03-29 74/week @ 2024-04-05 73/week @ 2024-04-12 74/week @ 2024-04-19 82/week @ 2024-04-26 67/week @ 2024-05-03 74/week @ 2024-05-10 72/week @ 2024-05-17 65/week @ 2024-05-24 51/week @ 2024-05-31 40/week @ 2024-06-07 64/week @ 2024-06-14 65/week @ 2024-06-21 34/week @ 2024-06-28

209 downloads per month
Used in 18 crates (5 directly)

MIT/Apache

7KB
100 lines

This crate contains three derive macros for casper_types::CLTyped, casper_types::bytesrepr::FromBytes and casper_types::bytesrepr::ToBytes.

You might want to implement these three traits for a struct you want to store in Casper storage. See storage API documentation on docs.casperlabs.io.

A macro declared on a struct like this:

use casper_types_derive::{CLTyped, ToBytes, FromBytes};

#[derive(CLTyped, ToBytes, FromBytes)]
struct Dog {
  name: String,
  likes_treat: BTreeMap<String, bool>,
}

Will expand into this:

impl CLTypes for Dog {
  fn cl_type(&self) -> CLType {
    CLType::Any
  }
}

impl FromBytes for Dog {
  fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), casper_types::bytesrepr::Error> {
    let (name, bytes) = FromBytes::from_bytes(bytes)?;
    let (likes_treat, bytes) = FromBytes::from_bytes(bytes)?;
    let value = Dog {
      name,
      likes_treat,
    };
    Ok((value, bytes))
  }
}

impl ToBytes for Dog {
  fn serialized_length(&self) -> usize {
    let mut size = 0;
    size += name.serialized_length();
    size += likes_treat.serialized_length();
    return size;
  }

  fn to_bytes(&self) -> Result<Vec<u8>, casper_types::bytesrepr::Error> {
    let mut vec = Vec::with_capacity(self.serialized_length());
    vec.append(self.name.to_bytes()?);
    vec.append(self.likes_treat.to_bytes()?);
    Ok(vec)
  }
}

Dependencies

~1.5MB
~35K SLoC