1#![doc(test(attr(deny(unused_must_use))))]
4#![doc = std::include_str!(concat!(env!("OUT_DIR"), "/crate-docs.md"))]
5#![warn(missing_docs)]
7
8use std::cell::RefCell;
9use std::rc::Rc;
10use std::str::FromStr;
11
12#[doc(hidden)]
13pub use log;
14
15pub mod builder;
16pub mod entity;
17pub mod id;
18
19#[cfg(feature = "perfetto")]
20pub mod perfetto_trace_builder;
21
22pub mod tracker;
24pub use tracker::{Track, Tracker};
25
26pub type Writer = Box<dyn std::io::Write>;
28type SharedWriter = Rc<RefCell<Writer>>;
29
30#[must_use]
32pub fn str_to_level(lvl: &str) -> log::Level {
33 match log::Level::from_str(lvl) {
34 Ok(level) => level,
35 Err(_) => panic!("Unable to parse level string '{lvl}'"),
36 }
37}
38
39pub use id::Id;
45
46pub mod test_helpers;
47pub mod trace_visitor;
48
49pub const NO_ID: Id = id::Id(0);
51
52pub const ROOT: Id = id::Id(1);
54
55#[macro_export]
63macro_rules! create_id {
64 ($entity:expr) => {{ $entity.tracker.unique_id() }};
65}
66
67#[macro_export]
72macro_rules! track_create_object {
73 ($entity:expr ; $created:expr, $size:expr, $units:expr, $req_type:expr, $($details:tt)+) => {{
74 let entity = &$entity;
75 if entity.trace_enabled() {
76 let details = format!($($details)+);
77 entity.tracker.create_object(
78 entity.id,
79 $created,
80 $size,
81 $units,
82 $req_type,
83 &details,
84 );
85 }
86 }};
87}
88
89#[macro_export]
96macro_rules! destroy_id {
97 ($entity:expr ; $id:expr) => {{
98 $entity.tracker.destroy($entity.id, $id);
99 }};
100}
101
102#[macro_export]
104macro_rules! destroy {
105 ($entity:expr) => {{
106 match &$entity.parent {
107 Some(parent) => $entity.tracker.destroy($entity.id, parent.id),
108 None => $entity.tracker.destroy($entity.id, $crate::NO_ID),
109 };
110 }};
111}
112
113#[macro_export]
115macro_rules! connect {
116 ($from_entity:expr ; $to_entity:expr) => {{
117 $from_entity.tracker.connect($from_entity.id, $to_entity.id);
118 }};
119}
120
121#[macro_export]
123macro_rules! set_time {
124 ($entity:expr ; $time_ns:expr) => {{
125 $entity.tracker.time($entity.id, $time_ns);
126 }};
127}
128
129#[macro_export]
136macro_rules! log_base {
137 ($entity:expr ; $lvl:expr, $($arg:tt)+) => {{
138 let entity = &$entity;
139 let level = $lvl;
140 if entity.enabled_for(level) {
141 entity.tracker.log(entity.id, level, format_args!($($arg)+));
142 }
143 }};
144}
145
146#[macro_export]
149macro_rules! trace {
150 ($entity:expr ; $($arg:tt)+) => (
151 $crate::log_base!($entity ; $crate::log::Level::Trace, $($arg)+);
152 );
153}
154
155#[macro_export]
158macro_rules! debug {
159 ($entity:expr ; $($arg:tt)+) => (
160 $crate::log_base!($entity ; $crate::log::Level::Debug, $($arg)+);
161 );
162}
163
164#[macro_export]
167macro_rules! info {
168 ($entity:expr ; $($arg:tt)+) => (
169 $crate::log_base!($entity ; $crate::log::Level::Info, $($arg)+);
170 );
171}
172
173#[macro_export]
176macro_rules! warn {
177 ($entity:expr ; $($arg:tt)+) => (
178 $crate::log_base!($entity ; $crate::log::Level::Warn, $($arg)+);
179 );
180}
181
182#[macro_export]
185macro_rules! error {
186 ($entity:expr ; $($arg:tt)+) => (
187 $crate::log_base!($entity ; $crate::log::Level::Error, $($arg)+);
188 );
189}
190
191pub mod gwr_track_capnp {
198 #![allow(missing_docs)]
200 #![allow(clippy::all)]
201 #![allow(clippy::pedantic)]
202 include!(concat!(env!("OUT_DIR"), "/gwr_track_capnp.rs"));
203}