1mod info;
2pub mod macros;
3mod request;
4mod tests;
5mod types;
6
7use crate::info::hash::get_hash;
8use crate::info::runtime::get_runtime;
9use crate::info::stack_trace::get_stack_trace;
10use crate::info::system_usage::get_system_usage;
11use crate::info::thread::get_thread_id;
12use crate::info::time::get_time;
13use crate::request::make_request;
14use crate::types::{QuoPayload, QuoPayloadLanguage, QuoPayloadMeta, QuoPayloadVariable};
15use std::fmt::Debug;
16
17#[cfg(debug_assertions)]
28#[doc(hidden)]
29fn quo_create_payload<T: Debug>(
30 value: T,
31 name: &str,
32 line: u32,
33 file: &str,
34 is_mutable: bool,
35 is_expression: bool,
36 package_name: &str,
37) -> QuoPayload {
38 let id = 0; let var_type_raw = std::any::type_name_of_val(&value).to_string();
40 let var_type = var_type_raw
41 .strip_prefix('&')
42 .unwrap_or(&var_type_raw)
43 .to_string();
44
45 let value_str = format!("{:?}", value);
46 let (time_epoch_ms, uid) = get_time();
47 let memory_address = Some(format!("{:p}", &value as *const T));
48 let grouping_hash = get_hash(&var_type_raw, name, package_name);
49 let (stack_trace, caller_function) = get_stack_trace();
50 let thread_info = get_thread_id();
51 let (cpu_usage, memory_usage) = get_system_usage();
52 let runtime = get_runtime();
53
54 QuoPayload {
55 language: QuoPayloadLanguage::Rust,
56 meta: QuoPayloadMeta {
57 origin: package_name.to_string(),
58 sender_origin: format!("{}:{}", file, line),
59 variable: QuoPayloadVariable {
60 var_type: var_type.clone(),
61 name: name.to_string(),
62 value: value_str,
63 is_constant: name == name.to_uppercase(),
64 is_mutable: is_mutable || var_type_raw.contains("&mut "),
65 is_expression,
66 memory_address,
67 grouping_hash,
68 },
69 id,
70 uid,
71 time_epoch_ms,
72 stack_trace,
73 thread_info,
74 runtime,
75 cpu_usage,
76 memory_usage,
77 caller_function,
78 },
79 }
80}
81
82#[cfg(debug_assertions)]
93#[doc(hidden)]
94fn quo<T: Debug>(
95 value: T,
96 name: &str,
97 line: u32,
98 file: &str,
99 is_mutable: bool,
100 is_expression: bool,
101 package_name: &str,
102) {
103 #[cfg(debug_assertions)]
104 {
105 let env_host = option_env!("QUO_HOST").unwrap_or("http://127.0.0.1");
106 let env_port = option_env!("QUO_PORT").unwrap_or("7312");
107
108 let body = quo_create_payload(
109 value,
110 name,
111 line,
112 file,
113 is_mutable,
114 is_expression,
115 package_name,
116 );
117 let quo_server_address = format!("{}:{}/payload", env_host, env_port);
118
119 make_request(&quo_server_address, body);
120 }
121}
122
123#[cfg(debug_assertions)]
125#[doc(hidden)]
126pub fn __private_quo<T: Debug>(
127 value: T,
128 name: &str,
129 line: u32,
130 file: &str,
131 is_mutable: bool,
132 is_expression: bool,
133 package_name: &str,
134) {
135 quo(
136 value,
137 name,
138 line,
139 file,
140 is_mutable,
141 is_expression,
142 package_name,
143 )
144}