Skip to content

Latest commit

 

History

History
76 lines (56 loc) · 1.6 KB

README.md

File metadata and controls

76 lines (56 loc) · 1.6 KB

Magic Space

Logo Yes, It's AI generated.

Crates.io Docs.rs

Derive macro for Solana program state structs that automatically calculates the space required for a struct or enum.

Code mostly taken from @coral-xyz/anchor project, modified to work without the anchor crate.

Source:

Installation

Add the following to your Cargo.toml:

[dependencies]
magic_space = "^0.1.0"

Or cargo add:

$ cargo add magic-space

Usage

use magic_space::*;

#[derive(MagicSpace)]
struct SomeAccount {
    apples: u32,
    oranges: u32,
    #[max_len(10)]
    others: Vec<u32>,
    #[max_len(10)]
    name: String,
    #[max_len(10, 5, 5)]
    some_other: Vec<Vec<Vec<u8>>>,
    #[max_len(10)]
    e: Vec<Option<SomeEnum>>,
}

If you have dynamic allocation, you can still use the max_len attribute as follows: #[max_len(0)] and avoid worrying about the vector length, that way you can apply the following pattern:

#[derive(MagicSpace)]
pub struct DynamicSizeVecPattern {
    #[max_len(0)]
    pub data: Vec<Item>,
}

impl DynamicSizeVecPattern {
    pub fn size(vec_len: usize, str_len: usize) -> usize {
        Self::MAGIC_SPACE + (vec_len * Item::size(str_len))
    }
}

#[derive(MagicSpace)]
pub struct Item {
    pub data: u64,
    #[max_len(0)]
    pub name: String,
}

License

Apache 2.0 LICENSE