limine_request

Macro limine_request 

Source
macro_rules! limine_request {
    (
        $(#[$outer_meta:meta])*
        $vis:vis struct $req:ident: [$val1:expr, $val2:expr] {
            $(
                $(#[$inner_meta:meta])*
                $vis_f:vis $ident_f:ident: $ty:ty,
            )*
        }
    ) => { ... };
}
Expand description

This creates a limine request with const defaults by black magic. It also automatically creates the id and revision fields.

ยงExample

use limine_protocol::limine_request;
use core::ptr::NonNull;

pub struct TestResponse {
    /// The response revision number
    pub revision: u64,
    /// A test number from the bootloader (not actually)
    pub number: u64,
}

limine_request! {
    /// A test limine request, being public isn't required    
    pub struct TestRequest: [0xdead, 0xbeef] {
        /// The response
        pub response: Option<NonNull<TestResponse>>,
    }
}

Will be expanded to

use core::ptr::NonNull;
pub struct TestResponse {
    /// The response revision number
    pub revision: u64,
    /// A test number from the bootloader (not actually)
    pub number: u64,
}

pub struct TestRequest {
    /// The request id array
    pub id: [u64; 4],
    /// The request revision
    pub revision: u64,
    /// The response
    pub response: Option<NonNull<TestResponse>>,
}

impl TestRequest {
    /// Create a new instance of this request
    pub const fn new() -> Self {
        use limine_protocol::ConstDefault;
        Self {
            id: [
                limine_protocol::COMMON_MAGIC[0],
                limine_protocol::COMMON_MAGIC[1],
                0xdead,
                0xbeef,
            ],
            revision: 0,
            response: None,
        }
    }
}