use crate::{HeaderTagFlag, HeaderTagHeader, HeaderTagType};
use core::mem;
use multiboot2_common::{MaybeDynSized, Tag};
#[repr(u32)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum ConsoleHeaderTagFlags {
ConsoleRequired = 0,
EgaTextSupported = 1,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(C, align(8))]
pub struct ConsoleHeaderTag {
header: HeaderTagHeader,
console_flags: ConsoleHeaderTagFlags,
}
impl ConsoleHeaderTag {
#[must_use]
pub const fn new(flags: HeaderTagFlag, console_flags: ConsoleHeaderTagFlags) -> Self {
let header =
HeaderTagHeader::new(HeaderTagType::ConsoleFlags, flags, Self::BASE_SIZE as u32);
Self {
header,
console_flags,
}
}
#[must_use]
pub const fn typ(&self) -> HeaderTagType {
self.header.typ()
}
#[must_use]
pub const fn flags(&self) -> HeaderTagFlag {
self.header.flags()
}
#[must_use]
pub const fn size(&self) -> u32 {
self.header.size()
}
#[must_use]
pub const fn console_flags(&self) -> ConsoleHeaderTagFlags {
self.console_flags
}
}
impl MaybeDynSized for ConsoleHeaderTag {
type Header = HeaderTagHeader;
const BASE_SIZE: usize = mem::size_of::<HeaderTagHeader>() + mem::size_of::<u32>();
fn dst_len(_header: &Self::Header) -> Self::Metadata {}
}
impl Tag for ConsoleHeaderTag {
type IDType = HeaderTagType;
const ID: HeaderTagType = HeaderTagType::ConsoleFlags;
}