// SPDX-License-Identifier: GPL-2.0

//! Rust printing macros sample.

use kernel::pr_cont;
use kernel::prelude::*;

module! {
    type: RustPrint,
    name: "rust_print",
    authors: ["Rust for Linux Contributors"],
    description: "Rust printing macros sample",
    license: "GPL",
}

struct RustPrint;

#[expect(clippy::disallowed_macros)]
fn arc_print() -> Result {
    use kernel::sync::*;

    let a = Arc::new(1, GFP_KERNEL)?;
    let b = UniqueArc::new("hello, world", GFP_KERNEL)?;

    // Prints the value of data in `a`.
    pr_info!("{}", a);

    // Uses ":?" to print debug fmt of `b`.
    pr_info!("{:?}", b);

    let a: Arc<&str> = b.into();
    let c = a.clone();

    // Uses `dbg` to print, will move `c` (for temporary debugging purposes).
    dbg!(c);

    {
        // `Arc` can be used to delegate dynamic dispatch and the following is an example.
        // Both `i32` and `&str` implement `Display`. This enables us to express a unified
        // behaviour, contract or protocol on both `i32` and `&str` into a single `Arc` of
        // type `Arc<dyn Display>`.

        use core::fmt::Display;
        fn arc_dyn_print(arc: &Arc<dyn Display>) {
            pr_info!("Arc<dyn Display> says {arc}");
        }

        let a_i32_display: Arc<dyn Display> = Arc::new(42i32, GFP_KERNEL)?;
        let a_str_display: Arc<dyn Display> = a.clone();

        arc_dyn_print(&a_i32_display);
        arc_dyn_print(&a_str_display);
    }

    // Pretty-prints the debug formatting with lower-case hexadecimal integers.
    pr_info!("{:#x?}", a);

    Ok(())
}

impl kernel::Module for RustPrint {
    fn init(_module: &'static ThisModule) -> Result<Self> {
        pr_info!("Rust printing macros sample (init)\n");

        pr_emerg!("Emergency message (level 0) without args\n");
        pr_alert!("Alert message (level 1) without args\n");
        pr_crit!("Critical message (level 2) without args\n");
        pr_err!("Error message (level 3) without args\n");
        pr_warn!("Warning message (level 4) without args\n");
        pr_notice!("Notice message (level 5) without args\n");
        pr_info!("Info message (level 6) without args\n");

        pr_info!("A line that");
        pr_cont!(" is continued");
        pr_cont!(" without args\n");

        pr_emerg!("{} message (level {}) with args\n", "Emergency", 0);
        pr_alert!("{} message (level {}) with args\n", "Alert", 1);
        pr_crit!("{} message (level {}) with args\n", "Critical", 2);
        pr_err!("{} message (level {}) with args\n", "Error", 3);
        pr_warn!("{} message (level {}) with args\n", "Warning", 4);
        pr_notice!("{} message (level {}) with args\n", "Notice", 5);
        pr_info!("{} message (level {}) with args\n", "Info", 6);

        pr_info!("A {} that", "line");
        pr_cont!(" is {}", "continued");
        pr_cont!(" with {}\n", "args");

        arc_print()?;

        trace::trace_rust_sample_loaded(42);

        Ok(RustPrint)
    }
}

impl Drop for RustPrint {
    fn drop(&mut self) {
        pr_info!("Rust printing macros sample (exit)\n");
    }
}

mod trace {
    use kernel::ffi::c_int;

    kernel::declare_trace! {
        /// # Safety
        ///
        /// Always safe to call.
        unsafe fn rust_sample_loaded(magic: c_int);
    }

    pub(crate) fn trace_rust_sample_loaded(magic: i32) {
        // SAFETY: Always safe to call.
        unsafe { rust_sample_loaded(magic as c_int) }
    }
}
