cougr-core 1.0.0

Cougr - A Soroban-compatible ECS framework for on-chain gaming on Stellar
Documentation
use crate::resource::{Resource, ResourceTrait};
use alloc::vec::Vec;
use soroban_sdk::Env;

pub(super) fn insert_resource<R: ResourceTrait>(
    resources: &mut Vec<Resource>,
    env: &Env,
    resource: &R,
) {
    let resource_type = R::resource_type();
    let encoded = Resource::new(resource_type.clone(), resource.serialize(env));

    for index in 0..resources.len() {
        if let Some(existing) = resources.get(index) {
            if existing.resource_type == resource_type {
                resources[index] = encoded;
                return;
            }
        }
    }

    resources.push(encoded);
}

pub(super) fn get_resource<R: ResourceTrait>(resources: &[Resource], env: &Env) -> Option<R> {
    let resource_type = R::resource_type();
    for resource in resources {
        if resource.resource_type == resource_type {
            return R::deserialize(env, &resource.data);
        }
    }
    None
}

pub(super) fn remove_resource<R: ResourceTrait>(resources: &mut Vec<Resource>) -> Option<Resource> {
    let resource_type = R::resource_type();
    let mut found = None;
    let mut retained = Vec::new();

    for resource in resources.iter() {
        if resource.resource_type == resource_type {
            found = Some(resource.clone());
        } else {
            retained.push(resource.clone());
        }
    }

    if found.is_some() {
        *resources = retained;
    }

    found
}