use super::admit::lawful_entries;
use super::encode::encode_body;
use super::project::{encoded_actions, encoded_delivery};
use super::reproduce_run::reproduce;
use super::{
SimulationManifest, SimulationReproduction, TRANSCRIPT_TAG, TranscriptAddress, TranscriptEntry,
TranscriptMaterial, TranscriptPack, TranscriptRefusal,
};
use crate::identity::ContentAddress;
use crate::network::simulation::{SimNet, Topology};
pub fn recorded_live(
topology: &Topology,
entries: Vec<TranscriptEntry>,
) -> Result<TranscriptPack, TranscriptRefusal> {
write_pack(topology.clone(), TranscriptMaterial::RecordedLive, entries)
}
pub fn simulated<Payload>(
sim: &SimNet<Payload>,
encode_payload: fn(&Payload) -> Vec<u8>,
) -> Result<(TranscriptPack, SimulationReproduction), TranscriptRefusal> {
let actions = encoded_actions(sim.retained_actions(), encode_payload);
let entries = sim
.retained_history()
.iter()
.map(|delivery| encoded_delivery(delivery, encode_payload))
.collect();
let material = TranscriptMaterial::Simulated(SimulationManifest::captured(
sim.retained_schedule().clone(),
actions,
));
let pack = write_pack(sim.retained_topology().clone(), material, entries)?;
let reproduction = reproduce(&pack)?;
Ok((pack, reproduction))
}
fn write_pack(
topology: Topology,
material: TranscriptMaterial,
entries: Vec<TranscriptEntry>,
) -> Result<TranscriptPack, TranscriptRefusal> {
lawful_entries(&topology, &entries)?;
let body = encode_body(&material, &topology, &entries);
let address = TranscriptAddress::derived(ContentAddress::derived(TRANSCRIPT_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);
Ok(TranscriptPack::assembled(
topology, material, address, entries, encoded,
))
}