Separate the "program" feature of solana-sdk
into a new crate called solana-program
(bp #12989) (#13131)
* Add solana-program-sdk boilerplate (cherry picked from commit3718771ffb
) # Conflicts: # sdk/Cargo.toml * Initial population of solana-program-sdk (cherry picked from commit63db324204
) # Conflicts: # Cargo.lock * Port programs to solana-program-sdk (cherry picked from commitfe68f7f786
) # Conflicts: # programs/bpf/Cargo.lock # programs/bpf/rust/128bit/Cargo.toml # programs/bpf/rust/128bit_dep/Cargo.toml # programs/bpf/rust/alloc/Cargo.toml # programs/bpf/rust/call_depth/Cargo.toml # programs/bpf/rust/custom_heap/Cargo.toml # programs/bpf/rust/dep_crate/Cargo.toml # programs/bpf/rust/deprecated_loader/Cargo.toml # programs/bpf/rust/dup_accounts/Cargo.toml # programs/bpf/rust/error_handling/Cargo.toml # programs/bpf/rust/external_spend/Cargo.toml # programs/bpf/rust/instruction_introspection/Cargo.toml # programs/bpf/rust/invoke/Cargo.toml # programs/bpf/rust/invoked/Cargo.toml # programs/bpf/rust/iter/Cargo.toml # programs/bpf/rust/many_args/Cargo.toml # programs/bpf/rust/many_args_dep/Cargo.toml # programs/bpf/rust/noop/Cargo.toml # programs/bpf/rust/panic/Cargo.toml # programs/bpf/rust/param_passing/Cargo.toml # programs/bpf/rust/param_passing_dep/Cargo.toml # programs/bpf/rust/rand/Cargo.toml # programs/bpf/rust/ristretto/Cargo.toml # programs/bpf/rust/sanity/Cargo.toml # programs/bpf/rust/sha256/Cargo.toml # programs/bpf/rust/sysval/Cargo.toml * Only activate legacy program feature for the solana-sdk crate (cherry picked from commit85c51f5787
) * Run serum-dex unit tests (cherry picked from commit92ce381d60
) * Rename solana-program-sdk to solana-program (cherry picked from commitdd711ab5fb
) # Conflicts: # programs/bpf/rust/128bit/Cargo.toml # programs/bpf/rust/128bit_dep/Cargo.toml # programs/bpf/rust/alloc/Cargo.toml # programs/bpf/rust/call_depth/Cargo.toml # programs/bpf/rust/custom_heap/Cargo.toml # programs/bpf/rust/dep_crate/Cargo.toml # programs/bpf/rust/deprecated_loader/Cargo.toml # programs/bpf/rust/dup_accounts/Cargo.toml # programs/bpf/rust/error_handling/Cargo.toml # programs/bpf/rust/external_spend/Cargo.toml # programs/bpf/rust/instruction_introspection/Cargo.toml # programs/bpf/rust/invoke/Cargo.toml # programs/bpf/rust/invoked/Cargo.toml # programs/bpf/rust/iter/Cargo.toml # programs/bpf/rust/many_args/Cargo.toml # programs/bpf/rust/many_args_dep/Cargo.toml # programs/bpf/rust/noop/Cargo.toml # programs/bpf/rust/panic/Cargo.toml # programs/bpf/rust/param_passing/Cargo.toml # programs/bpf/rust/param_passing_dep/Cargo.toml # programs/bpf/rust/rand/Cargo.toml # programs/bpf/rust/ristretto/Cargo.toml # programs/bpf/rust/sanity/Cargo.toml # programs/bpf/rust/sha256/Cargo.toml # programs/bpf/rust/sysval/Cargo.toml * Update frozen_abi hashes The movement of files in sdk/ caused ABI hashes to change (cherry picked from commita4956844bd
) * Resolve merge conflicts Co-authored-by: Michael Vines <mvines@gmail.com>
This commit is contained in:
57
sdk/program/src/program_pack.rs
Normal file
57
sdk/program/src/program_pack.rs
Normal file
@@ -0,0 +1,57 @@
|
||||
//! State transition types
|
||||
|
||||
use crate::program_error::ProgramError;
|
||||
|
||||
/// Check if a program account state is initialized
|
||||
pub trait IsInitialized {
|
||||
/// Is initialized
|
||||
fn is_initialized(&self) -> bool;
|
||||
}
|
||||
|
||||
/// Depends on Sized
|
||||
pub trait Sealed: Sized {}
|
||||
|
||||
/// Safely and efficiently (de)serialize account state
|
||||
pub trait Pack: Sealed {
|
||||
/// The length, in bytes, of the packed representation
|
||||
const LEN: usize;
|
||||
#[doc(hidden)]
|
||||
fn pack_into_slice(&self, dst: &mut [u8]);
|
||||
#[doc(hidden)]
|
||||
fn unpack_from_slice(src: &[u8]) -> Result<Self, ProgramError>;
|
||||
|
||||
/// Get the packed length
|
||||
fn get_packed_len() -> usize {
|
||||
Self::LEN
|
||||
}
|
||||
|
||||
/// Unpack from slice and check if initialized
|
||||
fn unpack(input: &[u8]) -> Result<Self, ProgramError>
|
||||
where
|
||||
Self: IsInitialized,
|
||||
{
|
||||
let value = Self::unpack_unchecked(input)?;
|
||||
if value.is_initialized() {
|
||||
Ok(value)
|
||||
} else {
|
||||
Err(ProgramError::UninitializedAccount)
|
||||
}
|
||||
}
|
||||
|
||||
/// Unpack from slice without checking if initialized
|
||||
fn unpack_unchecked(input: &[u8]) -> Result<Self, ProgramError> {
|
||||
if input.len() != Self::LEN {
|
||||
return Err(ProgramError::InvalidAccountData);
|
||||
}
|
||||
Ok(Self::unpack_from_slice(input)?)
|
||||
}
|
||||
|
||||
/// Pack into slice
|
||||
fn pack(src: Self, dst: &mut [u8]) -> Result<(), ProgramError> {
|
||||
if dst.len() != Self::LEN {
|
||||
return Err(ProgramError::InvalidAccountData);
|
||||
}
|
||||
src.pack_into_slice(dst);
|
||||
Ok(())
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user