mod info;
pub mod macros;
mod request;
mod tests;
mod types;
use crate::info::hash::get_hash;
use crate::info::runtime::get_runtime;
use crate::info::stack_trace::get_stack_trace;
use crate::info::system_usage::get_system_usage;
use crate::info::thread::get_thread_id;
use crate::info::time::get_time;
use crate::request::make_request;
use crate::types::{QuoContext, QuoPayload, QuoPayloadLanguage, QuoPayloadMeta, QuoPayloadVariable};
pub use crate::types::QuoContext as __private_QuoContext;
use std::fmt::Debug;
#[cfg(debug_assertions)]
#[doc(hidden)]
fn quo_create_payload<T: Debug>(value: T, name: &str, ctx: QuoContext<'_>) -> QuoPayload {
let id = 0; let var_type_raw = std::any::type_name_of_val(&value).to_string();
let var_type = var_type_raw
.strip_prefix('&')
.unwrap_or(&var_type_raw)
.to_string();
let value_str = format!("{:?}", value);
let (time_epoch_ms, uid) = get_time();
let memory_address = Some(format!("{:p}", &value as *const T));
let grouping_hash = ctx.shared_grouping_hash.or_else(|| get_hash(&var_type_raw, name, ctx.package_name));
let (stack_trace, caller_function) = get_stack_trace();
let thread_info = get_thread_id();
let (cpu_usage, memory_usage) = get_system_usage();
let runtime = get_runtime();
QuoPayload {
language: QuoPayloadLanguage::Rust,
meta: QuoPayloadMeta {
origin: ctx.package_name.to_string(),
sender_origin: format!("{}:{}", ctx.file, ctx.line),
variable: QuoPayloadVariable {
var_type: var_type.clone(),
name: name.to_string(),
value: value_str,
is_constant: name == name.to_uppercase(),
is_mutable: ctx.is_mutable || var_type_raw.contains("&mut "),
is_expression: ctx.is_expression,
memory_address,
grouping_hash,
},
id,
uid,
time_epoch_ms,
stack_trace,
thread_info,
runtime,
cpu_usage,
memory_usage,
caller_function,
},
}
}
#[cfg(debug_assertions)]
#[doc(hidden)]
fn quo<T: Debug>(value: T, name: &str, ctx: QuoContext<'_>) {
#[cfg(debug_assertions)]
{
let env_host = option_env!("QUO_HOST").unwrap_or("http://127.0.0.1");
let env_port = option_env!("QUO_PORT").unwrap_or("7312");
let body = quo_create_payload(value, name, ctx);
let quo_server_address = format!("{}:{}/payload", env_host, env_port);
make_request(&quo_server_address, body);
}
}
#[cfg(debug_assertions)]
#[doc(hidden)]
pub fn __private_quo_grouping_hash(args_key: &str, package_name: &str) -> Option<String> {
get_hash("grouped", args_key, package_name)
}
#[cfg(debug_assertions)]
#[doc(hidden)]
pub fn __private_quo<T: Debug>(value: T, name: &str, ctx: QuoContext<'_>) {
quo(value, name, ctx)
}