#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

#23 in #casper

Download history 12/week @ 2024-11-08 22/week @ 2024-11-15 40/week @ 2024-11-22 59/week @ 2024-11-29 64/week @ 2024-12-06 61/week @ 2024-12-13 14/week @ 2024-12-20 7/week @ 2024-12-27 12/week @ 2025-01-03 26/week @ 2025-01-10 30/week @ 2025-01-17 14/week @ 2025-01-24 33/week @ 2025-01-31 25/week @ 2025-02-07 17/week @ 2025-02-14

80 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
~38K SLoC