use super::{
SEED_PACK_FORMAT_VERSION, SEED_PACK_TAG, SeedInput, SeedPack, SeedPackAddress, SeedPackRefusal,
};
use crate::descriptor::PopulationRef;
use crate::identity::{ContentAddress, encode_bytes, encode_length};
pub fn pack(population: PopulationRef, seeds: Vec<SeedInput>) -> Result<SeedPack, SeedPackRefusal> {
let body = encode_body(population, &seeds);
let address = SeedPackAddress::derived(ContentAddress::derived(SEED_PACK_TAG, &body));
let claim = address.address();
let mut encoded = Vec::with_capacity(claim.as_bytes().len().saturating_add(body.len()));
encoded.extend_from_slice(claim.as_bytes());
encoded.extend_from_slice(&body);
SeedPack::assembled(population, address, seeds, encoded)
}
fn encode_body(population: PopulationRef, seeds: &[SeedInput]) -> Vec<u8> {
let mut body = Vec::new();
body.extend_from_slice(&SEED_PACK_FORMAT_VERSION.to_be_bytes());
population.name().encode_into(&mut body);
encode_length(seeds.len(), &mut body);
for seed in seeds {
encode_bytes(seed.bytes(), &mut body);
}
body
}