1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//! Sized data trait implementation for Solana programs using Anchor framework
//!
//! This crate provides a trait and derive macro for calculating struct sizes at compile time,
//! which is particularly useful when working with Solana account initialization.
//!
//! # Example
//!
//! ```rust
//! use sized_data::SizedData;
//! use anchor_lang::prelude::*;
//!
//! #[derive(SizedData)]
//! pub struct UserAccount {
//! pub authority: Pubkey,
//! pub counter: u64,
//! }
//!
//! #[derive(Accounts)]
//! pub struct Initialize<'info> {
//! #[account(
//! init,
//! payer = user,
//! space = UserAccount::size_padded()
//! )]
//! pub user_account: Account<'info, UserAccount>,
//! #[account(mut)]
//! pub user: Signer<'info>,
//! pub system_program: Program<'info, System>,
//! }
//! ```
use Pubkey;
pub use *;
/// A trait for types that can calculate their size at compile time.
///
/// Used primarily with Anchor accounts to determine required space allocation.
/// The trait provides two methods:
/// - `size()`: Returns the raw size of the type
/// - `size_padded()`: Returns the size including Anchor's 8-byte discriminator
///
/// # Examples
///
/// ```rust
/// use sized_data::SizedData;
/// use anchor_lang::prelude::*;
///
/// #[derive(SizedData)]
/// pub struct UserAccount {
/// pub authority: Pubkey, // 32 bytes
/// pub counter: u64, // 8 bytes
/// }
///
/// assert_eq!(UserAccount::size(), 40); // Raw size
/// assert_eq!(UserAccount::size_padded(), 48); // Including discriminator
/// ```