#casper #derive #contracts #boilerplate #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

#21 in #casper

Download history 53/week @ 2024-07-22 51/week @ 2024-07-29 61/week @ 2024-08-05 51/week @ 2024-08-12 33/week @ 2024-08-19 50/week @ 2024-08-26 57/week @ 2024-09-02 38/week @ 2024-09-09 43/week @ 2024-09-16 68/week @ 2024-09-23 38/week @ 2024-09-30 58/week @ 2024-10-14 30/week @ 2024-10-21 30/week @ 2024-10-28 52/week @ 2024-11-04

170 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
~37K SLoC