vertigo 0.1.1

Reactive Real-DOM library for Rust
Documentation
use std::rc::Rc;

use crate::struct_mut::HashMapMut;

use self::{
    memory_block::MemoryBlock,
    js_value_struct::{decode_js_value, JsValue}
};

pub mod memory_block_write;
pub mod memory_block_read;
pub mod memory_block;
pub mod js_value_struct;
pub mod js_value_builder;

#[derive(Clone, Default)]
pub struct Arguments {
    blocks: Rc<HashMapMut<u32, MemoryBlock>>
}

impl Arguments {
    pub fn alloc(&self, size: u32) -> u32 {
        let block = MemoryBlock::new(size);
        let ptr = block.get_ptr();
        self.blocks.insert(ptr, block);
        ptr
    }

    pub fn free(&self, pointer: u32) {
        let block = self.blocks.remove(&pointer);

        if block.is_none() {
            log::error!("Failed to release memory block at address: {pointer}");
        }
    }

    pub fn get_by_ptr(&self, ptr: u32) -> JsValue {
        if ptr == 0 {
            return JsValue::Undefined;
        }

        let param = self.blocks.remove(&ptr);

        if let Some(param) = param {
            match decode_js_value(param) {
                Ok(value) => value,
                Err(err) => {
                    log::error!("get_by_ptr - error decode: {err}");
                    JsValue::Undefined
                }
            }
        } else {
            log::error!("get_by_ptr - not found MemoryBlock ptr={ptr}");
            JsValue::Undefined
        }
    }

    pub fn set(&self, memory_block: MemoryBlock) {
        let ptr = memory_block.get_ptr();
        self.blocks.insert(ptr, memory_block);
    }
}