xref: /linux/samples/rust/rust_print.rs (revision cc41670e)
1c3630df6SMiguel Ojeda // SPDX-License-Identifier: GPL-2.0
2c3630df6SMiguel Ojeda 
3c3630df6SMiguel Ojeda //! Rust printing macros sample.
4c3630df6SMiguel Ojeda 
5c3630df6SMiguel Ojeda use kernel::pr_cont;
6c3630df6SMiguel Ojeda use kernel::prelude::*;
7c3630df6SMiguel Ojeda 
8c3630df6SMiguel Ojeda module! {
9c3630df6SMiguel Ojeda     type: RustPrint,
10b13c9880SGary Guo     name: "rust_print",
11b13c9880SGary Guo     author: "Rust for Linux Contributors",
12b13c9880SGary Guo     description: "Rust printing macros sample",
13b13c9880SGary Guo     license: "GPL",
14c3630df6SMiguel Ojeda }
15c3630df6SMiguel Ojeda 
16c3630df6SMiguel Ojeda struct RustPrint;
17c3630df6SMiguel Ojeda 
arc_print() -> Result18f431c5c5SBoqun Feng fn arc_print() -> Result {
19f431c5c5SBoqun Feng     use kernel::sync::*;
20f431c5c5SBoqun Feng 
21*cc41670eSWedson Almeida Filho     let a = Arc::new(1, GFP_KERNEL)?;
22*cc41670eSWedson Almeida Filho     let b = UniqueArc::new("hello, world", GFP_KERNEL)?;
23f431c5c5SBoqun Feng 
24f431c5c5SBoqun Feng     // Prints the value of data in `a`.
25f431c5c5SBoqun Feng     pr_info!("{}", a);
26f431c5c5SBoqun Feng 
27f431c5c5SBoqun Feng     // Uses ":?" to print debug fmt of `b`.
28f431c5c5SBoqun Feng     pr_info!("{:?}", b);
29f431c5c5SBoqun Feng 
30f431c5c5SBoqun Feng     let a: Arc<&str> = b.into();
31f431c5c5SBoqun Feng     let c = a.clone();
32f431c5c5SBoqun Feng 
33f431c5c5SBoqun Feng     // Uses `dbg` to print, will move `c` (for temporary debugging purposes).
34f431c5c5SBoqun Feng     dbg!(c);
35f431c5c5SBoqun Feng 
36f431c5c5SBoqun Feng     // Pretty-prints the debug formatting with lower-case hexadecimal integers.
37f431c5c5SBoqun Feng     pr_info!("{:#x?}", a);
38f431c5c5SBoqun Feng 
39f431c5c5SBoqun Feng     Ok(())
40f431c5c5SBoqun Feng }
41f431c5c5SBoqun Feng 
42c3630df6SMiguel Ojeda impl kernel::Module for RustPrint {
init(_module: &'static ThisModule) -> Result<Self>43c3630df6SMiguel Ojeda     fn init(_module: &'static ThisModule) -> Result<Self> {
44c3630df6SMiguel Ojeda         pr_info!("Rust printing macros sample (init)\n");
45c3630df6SMiguel Ojeda 
46c3630df6SMiguel Ojeda         pr_emerg!("Emergency message (level 0) without args\n");
47c3630df6SMiguel Ojeda         pr_alert!("Alert message (level 1) without args\n");
48c3630df6SMiguel Ojeda         pr_crit!("Critical message (level 2) without args\n");
49c3630df6SMiguel Ojeda         pr_err!("Error message (level 3) without args\n");
50c3630df6SMiguel Ojeda         pr_warn!("Warning message (level 4) without args\n");
51c3630df6SMiguel Ojeda         pr_notice!("Notice message (level 5) without args\n");
52c3630df6SMiguel Ojeda         pr_info!("Info message (level 6) without args\n");
53c3630df6SMiguel Ojeda 
54c3630df6SMiguel Ojeda         pr_info!("A line that");
55c3630df6SMiguel Ojeda         pr_cont!(" is continued");
56c3630df6SMiguel Ojeda         pr_cont!(" without args\n");
57c3630df6SMiguel Ojeda 
58c3630df6SMiguel Ojeda         pr_emerg!("{} message (level {}) with args\n", "Emergency", 0);
59c3630df6SMiguel Ojeda         pr_alert!("{} message (level {}) with args\n", "Alert", 1);
60c3630df6SMiguel Ojeda         pr_crit!("{} message (level {}) with args\n", "Critical", 2);
61c3630df6SMiguel Ojeda         pr_err!("{} message (level {}) with args\n", "Error", 3);
62c3630df6SMiguel Ojeda         pr_warn!("{} message (level {}) with args\n", "Warning", 4);
63c3630df6SMiguel Ojeda         pr_notice!("{} message (level {}) with args\n", "Notice", 5);
64c3630df6SMiguel Ojeda         pr_info!("{} message (level {}) with args\n", "Info", 6);
65c3630df6SMiguel Ojeda 
66c3630df6SMiguel Ojeda         pr_info!("A {} that", "line");
67c3630df6SMiguel Ojeda         pr_cont!(" is {}", "continued");
68c3630df6SMiguel Ojeda         pr_cont!(" with {}\n", "args");
69c3630df6SMiguel Ojeda 
70f431c5c5SBoqun Feng         arc_print()?;
71f431c5c5SBoqun Feng 
72c3630df6SMiguel Ojeda         Ok(RustPrint)
73c3630df6SMiguel Ojeda     }
74c3630df6SMiguel Ojeda }
75c3630df6SMiguel Ojeda 
76c3630df6SMiguel Ojeda impl Drop for RustPrint {
drop(&mut self)77c3630df6SMiguel Ojeda     fn drop(&mut self) {
78c3630df6SMiguel Ojeda         pr_info!("Rust printing macros sample (exit)\n");
79c3630df6SMiguel Ojeda     }
80c3630df6SMiguel Ojeda }
81