state_engine/common/
log_format.rs1use serde_json::Value;
2
3pub struct LogFormat;
11
12impl LogFormat {
13
14 pub fn call(class: &str, fn_name: &str, args: &[String]) -> String {
15 let args_str = args.join(", ");
16 format!("{}::{}({})", class, fn_name, args_str)
17 }
18
19 pub fn format_arg(value: &Value) -> String {
36 match value {
37 Value::String(s) if s.len() > 50 => {
38 format!("'{}'...", &s[..47])
39 }
40 Value::String(s) => {
41 format!("'{}'", s)
42 }
43 Value::Array(arr) => {
44 if arr.is_empty() {
45 "[]".to_string()
46 } else {
47 format!("[{} items]", arr.len())
48 }
49 }
50 Value::Object(obj) => {
51 if obj.is_empty() {
52 "{}".to_string()
53 } else {
54 format!("{{{} fields}}", obj.len())
55 }
56 }
57 Value::Null => "null".to_string(),
58 Value::Bool(b) => b.to_string(),
59 Value::Number(n) => n.to_string(),
60 }
61 }
62
63 pub fn format_str_arg(s: &str) -> String {
72 if s.len() > 50 {
73 format!("'{}'...", &s[..47])
74 } else {
75 format!("'{}'", s)
76 }
77 }
78}
79
80#[macro_export]
90macro_rules! fn_log {
91 ($class:expr, $fun:expr $(, $arg:expr)*) => {{
92 #[cfg(feature = "logging")]
93 {
94 let args: Vec<String> = vec![
95 $(
96 $crate::common::log_format::LogFormat::format_str_arg($arg),
97 )*
98 ];
99 log::debug!("{}", $crate::common::log_format::LogFormat::call($class, $fun, &args));
100 }
101 }};
102}
103
104
105#[cfg(test)]
106mod tests {
107 use super::*;
108 use serde_json::json;
109
110 #[test]
111 fn test_fn_multiple_args() {
112 let result = LogFormat::call("State", "get", &[
113 "'cache.user'".to_string(),
114 "null".to_string(),
115 ]);
116 assert_eq!(result, "State::get('cache.user', null)");
117 }
118
119 #[test]
120 fn test_format_arg_long_string() {
121 let long_str = "a".repeat(60);
122 let result = LogFormat::format_arg(&json!(long_str));
123 assert!(result.starts_with("'aaa"));
124 assert!(result.ends_with("'..."));
125 assert_eq!(result.len(), 52); }
127
128 #[test]
129 fn test_format_str_arg_long_string() {
130 let long_str = "a".repeat(60);
131 let result = LogFormat::format_str_arg(&long_str);
132 assert!(result.starts_with("'aaa"));
133 assert!(result.ends_with("'..."));
134 }
135}