cubipods 0.1.1

A minimal EVM implemented in Rust.
Documentation
use std::collections::HashMap;

use crate::utils::bytes32::Bytes32;

#[derive(Default, Debug)]
pub struct Storage {
    storage: HashMap<Bytes32, Bytes32>,
}

impl Storage {
    pub fn new() -> Self {
        Self {
            ..Default::default()
        }
    }

    pub fn sstore(&mut self, slot: Bytes32, value: Bytes32) {
        self.storage.insert(slot, value);
    }

    pub fn sload(&self, slot: Bytes32) -> Option<&Bytes32> {
        self.storage.get(&slot)
    }

    pub fn size(&self) -> usize {
        self.storage.len()
    }

    pub fn is_empty(&self) -> bool {
        self.storage.is_empty()
    }
}

#[cfg(test)]
mod tests {
    use std::error::Error;

    use super::*;

    #[test]
    fn it_creates_storage() {
        let storage = Storage::new();

        assert_eq!(storage.storage.len(), 0);
        assert_eq!(storage.storage.is_empty(), true);
    }

    #[test]
    fn it_stores_and_loads_data() -> Result<(), Box<dyn Error>> {
        let mut storage = Storage::new();

        let slot = Bytes32::from(1);
        let value = "68656c6c6f".parse::<Bytes32>()?;

        storage.sstore(slot, value);

        assert_eq!(storage.sload(slot), Some(value).as_ref());

        Ok(())
    }

    #[test]
    fn it_returns_storage_size() {
        let storage = Storage::new();

        let size = storage.size();

        assert_eq!(size, 0);
    }

    #[test]
    fn it_checks_storage_emptiness() {
        let storage = Storage::new();

        let is_empty = storage.is_empty();

        assert_eq!(is_empty, true);
    }
}