xref: /openbmc/linux/samples/rust/rust_print.rs (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
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() -> Result18*f431c5c5SBoqun Feng fn arc_print() -> Result {
19*f431c5c5SBoqun Feng     use kernel::sync::*;
20*f431c5c5SBoqun Feng 
21*f431c5c5SBoqun Feng     let a = Arc::try_new(1)?;
22*f431c5c5SBoqun Feng     let b = UniqueArc::try_new("hello, world")?;
23*f431c5c5SBoqun Feng 
24*f431c5c5SBoqun Feng     // Prints the value of data in `a`.
25*f431c5c5SBoqun Feng     pr_info!("{}", a);
26*f431c5c5SBoqun Feng 
27*f431c5c5SBoqun Feng     // Uses ":?" to print debug fmt of `b`.
28*f431c5c5SBoqun Feng     pr_info!("{:?}", b);
29*f431c5c5SBoqun Feng 
30*f431c5c5SBoqun Feng     let a: Arc<&str> = b.into();
31*f431c5c5SBoqun Feng     let c = a.clone();
32*f431c5c5SBoqun Feng 
33*f431c5c5SBoqun Feng     // Uses `dbg` to print, will move `c` (for temporary debugging purposes).
34*f431c5c5SBoqun Feng     dbg!(c);
35*f431c5c5SBoqun Feng 
36*f431c5c5SBoqun Feng     // Pretty-prints the debug formatting with lower-case hexadecimal integers.
37*f431c5c5SBoqun Feng     pr_info!("{:#x?}", a);
38*f431c5c5SBoqun Feng 
39*f431c5c5SBoqun Feng     Ok(())
40*f431c5c5SBoqun Feng }
41*f431c5c5SBoqun 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 
70*f431c5c5SBoqun Feng         arc_print()?;
71*f431c5c5SBoqun 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