use alloc::vec::Vec;
use crate::ecs::asset_id::AssetId;
#[derive(Debug, Clone, Default)]
pub struct RuntimeMeshPayloads(Vec<(AssetId, Vec<u8>)>);
impl RuntimeMeshPayloads {
pub fn push(&mut self, id: AssetId, payload: Vec<u8>) {
self.0.push((id, payload));
}
pub fn get(&self, id: AssetId) -> Option<&[u8]> {
self.0
.iter()
.find(|(owner, _)| *owner == id)
.map(|(_, b)| &b[..])
}
pub fn iter(&self) -> impl Iterator<Item = (AssetId, &[u8])> {
self.0.iter().map(|(id, b)| (*id, &b[..]))
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
}
#[cfg(test)]
mod tests {
use super::*;
use alloc::vec;
#[test]
fn a_baked_payload_is_found_by_its_owner_id() {
let mut payloads = RuntimeMeshPayloads::default();
assert!(payloads.is_empty());
payloads.push(AssetId(7), vec![1, 2, 3]);
assert_eq!(payloads.get(AssetId(7)), Some(&[1u8, 2, 3][..]));
assert_eq!(payloads.get(AssetId(8)), None);
assert!(!payloads.is_empty());
assert_eq!(payloads.len(), 1);
}
#[test]
fn payloads_keep_the_order_they_were_installed_in() {
let mut payloads = RuntimeMeshPayloads::default();
payloads.push(AssetId(9), vec![1]);
payloads.push(AssetId(4), vec![2]);
let order: Vec<AssetId> = payloads.iter().map(|(id, _)| id).collect();
assert_eq!(order, vec![AssetId(9), AssetId(4)]);
}
}