effie 0.0.1

Idiomatic api to uefi
Documentation
use core::mem::MaybeUninit;

use crate::{protocols::File, Guid, Protocol, Result, Status};

#[repr(C)]
pub struct SimpleFilesystem {
    revision: u64,
    open_volume: unsafe extern "efiapi" fn(this: &Self, root: *mut *mut File) -> Status,
}

impl Protocol for SimpleFilesystem {
    const GUID: Guid = Guid::new(
        0x0964e5b22_u32.to_ne_bytes(),
        0x6459_u16.to_ne_bytes(),
        0x11d2_u16.to_ne_bytes(),
        0x8e,
        0x39,
        [0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b],
    );
}

impl SimpleFilesystem {
    pub fn open_volume(&self) -> Result<&File> {
        let mut volume = MaybeUninit::<*mut File>::uninit();
        let status = unsafe { (self.open_volume)(self, volume.as_mut_ptr()) };

        match status {
            Status::SUCCESS => Ok(unsafe { &*volume.assume_init() }),
            _ => Err(status),
        }
    }
}