/src/panic.rs
use core::fmt::Write;
use core::panic::PanicInfo;

use crate::console::{flush, write, ConsoleError};

static mut ALREADY_PANICKING: bool = false;

fn print_panic(info: &PanicInfo) -> Result<(), ConsoleError> {
    let mut format_buffer: heapless::Vec<u8, 256> = heapless::Vec::new();
    write(b"PANIC!\r\n")?;
    match write!(&mut format_buffer, "{}", info) {
        Ok(_) => {
            write(&format_buffer)?;
        }
        Err(_) => {
            write(b"could not get payload")?;
        }
    }
    write(b"\r\n")?;

    if let Some(location) = info.location() {
        write!(
            &mut format_buffer,
            "at {} line {}:{}",
            location.file(),
            location.line(),
            location.column()
        )
        .expect("write!");
        write(&format_buffer)?;
    } else {
        write(b"Unknown location")?;
    }
    write(b"\r\n")?;

    Ok(())
}

#[panic_handler]
fn panic(info: &PanicInfo) -> ! {
    unsafe {
        if ALREADY_PANICKING {
            // welp
            loop {}
        }
        ALREADY_PANICKING = true;
    }
    print_panic(info).expect("rut roh");

    flush();

    cortex_m::interrupt::disable();

    loop {}
}