Crates.io | casper_types_derive |
lib.rs | casper_types_derive |
version | 0.1.0 |
source | src |
created_at | 2021-04-13 15:13:34.195384 |
updated_at | 2021-04-13 15:13:34.195384 |
description | Use struct types in Casper contracts without boilerplate. |
homepage | |
repository | https://github.com/Kinrany/casper_types_derive |
max_upload_size | |
id | 382933 |
size | 7,365 |
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)
}
}