cbe_program_runtime/stable_log.rs
1//! Stable program log messages
2//!
3//! The format of these log messages should not be modified to avoid breaking downstream consumers
4//! of program logging
5use {
6 crate::{ic_logger_msg, log_collector::LogCollector},
7 itertools::Itertools,
8 cbe_sdk::{instruction::InstructionError, pubkey::Pubkey},
9 std::{cell::RefCell, rc::Rc},
10};
11
12/// Log a program invoke.
13///
14/// The general form is:
15///
16/// ```notrust
17/// "Program <address> invoke [<depth>]"
18/// ```
19pub fn program_invoke(
20 log_collector: &Option<Rc<RefCell<LogCollector>>>,
21 program_id: &Pubkey,
22 invoke_depth: usize,
23) {
24 ic_logger_msg!(
25 log_collector,
26 "Program {} invoke [{}]",
27 program_id,
28 invoke_depth
29 );
30}
31
32/// Log a message from the program itself.
33///
34/// The general form is:
35///
36/// ```notrust
37/// "Program log: <program-generated output>"
38/// ```
39///
40/// That is, any program-generated output is guaranteed to be prefixed by "Program log: "
41pub fn program_log(log_collector: &Option<Rc<RefCell<LogCollector>>>, message: &str) {
42 ic_logger_msg!(log_collector, "Program log: {}", message);
43}
44
45/// Emit a program data.
46///
47/// The general form is:
48///
49/// ```notrust
50/// "Program data: <binary-data-in-base64>*"
51/// ```
52///
53/// That is, any program-generated output is guaranteed to be prefixed by "Program data: "
54pub fn program_data(log_collector: &Option<Rc<RefCell<LogCollector>>>, data: &[&[u8]]) {
55 ic_logger_msg!(
56 log_collector,
57 "Program data: {}",
58 data.iter().map(base64::encode).join(" ")
59 );
60}
61
62/// Log return data as from the program itself. This line will not be present if no return
63/// data was set, or if the return data was set to zero length.
64///
65/// The general form is:
66///
67/// ```notrust
68/// "Program return: <program-id> <program-generated-data-in-base64>"
69/// ```
70///
71/// That is, any program-generated output is guaranteed to be prefixed by "Program return: "
72pub fn program_return(
73 log_collector: &Option<Rc<RefCell<LogCollector>>>,
74 program_id: &Pubkey,
75 data: &[u8],
76) {
77 ic_logger_msg!(
78 log_collector,
79 "Program return: {} {}",
80 program_id,
81 base64::encode(data)
82 );
83}
84
85/// Log successful program execution.
86///
87/// The general form is:
88///
89/// ```notrust
90/// "Program <address> success"
91/// ```
92pub fn program_success(log_collector: &Option<Rc<RefCell<LogCollector>>>, program_id: &Pubkey) {
93 ic_logger_msg!(log_collector, "Program {} success", program_id);
94}
95
96/// Log program execution failure
97///
98/// The general form is:
99///
100/// ```notrust
101/// "Program <address> failed: <program error details>"
102/// ```
103pub fn program_failure(
104 log_collector: &Option<Rc<RefCell<LogCollector>>>,
105 program_id: &Pubkey,
106 err: &InstructionError,
107) {
108 ic_logger_msg!(log_collector, "Program {} failed: {}", program_id, err);
109}