Skip to main content

quo_rust/
lib.rs

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/// This fn creates a QuoPayload. You might or might not question why this is a separate function: for testing.
18///
19/// # Example
20///
21/// let mut big_number: i128;
22///
23/// big_number = 170141183460469231731687303715884105727;
24///
25/// quo_create_payload(&big_number, "big_number", line!(), file!(), false, false, "quo-rust");
26///
27#[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; // @TODO Pretty useless currently.
39    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/// This fn sends the provided variable to Quo.
83///
84/// # Example
85///
86/// let mut big_number: i128;
87///
88/// big_number = 170141183460469231731687303715884105727;
89///
90/// quo(&big_number, "big_number", line!(), file!(), false, false, "quo-rust");
91///
92#[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/// Use the `quo!()` macro and not this fn directly.
124#[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}