1use std::cell::RefCell;
4use std::rc::Rc;
5
6#[doc(hidden)]
7pub use log;
8
9use crate::entity::Capacity;
10use crate::tracker::aka::AlternativeNames;
11use crate::tracker::{EntityManager, Track};
12use crate::{Id, SharedWriter, Writer};
13
14pub struct TextTracker {
16 entity_manager: EntityManager,
17
18 writer: SharedWriter,
20}
21
22impl TextTracker {
23 pub fn new(entity_manager: EntityManager, writer: Writer) -> Self {
25 Self {
26 entity_manager,
27 writer: Rc::new(RefCell::new(writer)),
28 }
29 }
30}
31
32impl Track for TextTracker {
34 fn unique_id(&self) -> Id {
35 self.entity_manager.unique_id()
36 }
37
38 fn enabled_level(&self, id: Id) -> log::Level {
39 self.entity_manager.enabled_level(id)
40 }
41
42 fn monitoring_window_size_for(&self, id: Id) -> Option<u64> {
43 self.entity_manager.monitoring_window_size_for(id)
44 }
45
46 fn add_entity(
47 &self,
48 id: Id,
49 entity_name: &str,
50 alternative_names: AlternativeNames,
51 ) -> log::Level {
52 self.entity_manager
53 .add_entity(id, entity_name, alternative_names)
54 }
55
56 fn enter(&self, id: Id, object: Id) {
57 if self.is_entity_enabled(id, log::Level::Trace) {
58 self.writer
59 .borrow_mut()
60 .write_all(format!("{id}: enter {object}\n").as_bytes())
61 .unwrap();
62 }
63 }
64
65 fn exit(&self, id: Id, object: Id) {
66 if self.is_entity_enabled(id, log::Level::Trace) {
67 self.writer
68 .borrow_mut()
69 .write_all(format!("{id}: exit {object}\n").as_bytes())
70 .unwrap();
71 }
72 }
73
74 fn value(&self, id: Id, value: f64) {
75 if self.is_entity_enabled(id, log::Level::Trace) {
76 self.writer
77 .borrow_mut()
78 .write_all(format!("{id}: value {value}\n").as_bytes())
79 .unwrap();
80 }
81 }
82
83 fn add_to_group(&self, activity: Id, group_id: Id) {
84 if self.is_entity_enabled(activity, log::Level::Trace) {
85 self.writer
86 .borrow_mut()
87 .write_all(format!("{activity}: added to group {group_id}\n").as_bytes())
88 .unwrap();
89 }
90 }
91
92 fn remove_from_group(&self, activity: Id, group_id: Id) {
93 if self.is_entity_enabled(activity, log::Level::Trace) {
94 self.writer
95 .borrow_mut()
96 .write_all(format!("{activity}: removed from group {group_id}\n").as_bytes())
97 .unwrap();
98 }
99 }
100
101 fn begin_activity(&self, activity: Id, lane: Id, name: &str) {
102 if self.is_entity_enabled(lane, log::Level::Trace) {
103 self.writer
104 .borrow_mut()
105 .write_all(format!("{activity}: activity begin {name} on lane {lane}\n").as_bytes())
106 .unwrap();
107 }
108 }
109
110 fn end_activity(&self, activity: Id) {
111 if self.is_entity_enabled(activity, log::Level::Trace) {
112 self.writer
113 .borrow_mut()
114 .write_all(format!("{activity}: activity end\n").as_bytes())
115 .unwrap();
116 }
117 }
118
119 fn create_entity(&self, created_by: Id, id: Id, name: &str) {
120 if self.is_entity_enabled(created_by, log::Level::Trace) {
121 self.writer
122 .borrow_mut()
123 .write_all(format!("{created_by}: created entity {id}, {name}\n").as_bytes())
124 .unwrap();
125 }
126 }
127
128 fn create_monitor(&self, created_by: Id, id: Id, name: &str) {
129 if self.is_entity_enabled(created_by, log::Level::Trace) {
130 self.writer
131 .borrow_mut()
132 .write_all(format!("{created_by}: created monitor {id}, {name}\n").as_bytes())
133 .unwrap();
134 }
135 }
136
137 fn create_lane(&self, created_by: Id, id: Id, name: &str) {
138 if self.is_entity_enabled(created_by, log::Level::Trace) {
139 self.writer
140 .borrow_mut()
141 .write_all(format!("{created_by}: created lane {id}, {name}\n").as_bytes())
142 .unwrap();
143 }
144 }
145
146 fn create_group(&self, created_by: Id, id: Id, name: &str) {
147 if self.is_entity_enabled(created_by, log::Level::Trace) {
148 self.writer
149 .borrow_mut()
150 .write_all(format!("{created_by}: created group {id}, {name}\n").as_bytes())
151 .unwrap();
152 }
153 }
154
155 fn create_object(
156 &self,
157 created_by: Id,
158 id: Id,
159 size: usize,
160 units: &str,
161 req_type: u8,
162 details: &str,
163 ) {
164 if self.is_entity_enabled(created_by, log::Level::Trace) {
165 self.writer
166 .borrow_mut()
167 .write_all(
168 format!(
169 "{created_by}: created object {id}, {req_type}, {size}, {units}, {details}\n"
170 )
171 .as_bytes(),
172 )
173 .unwrap();
174 }
175 }
176
177 fn capacity(&self, id: Id, capacity: Capacity) {
178 if self.is_entity_enabled(id, log::Level::Trace) {
179 self.writer
180 .borrow_mut()
181 .write_all(
182 format!("{id}: capacity {} {}\n", capacity.value, capacity.units).as_bytes(),
183 )
184 .unwrap();
185 }
186 }
187
188 fn destroy(&self, destroyed_by: Id, id: Id) {
189 if self.is_entity_enabled(id, log::Level::Trace) {
190 self.writer
191 .borrow_mut()
192 .write_all(format!("{destroyed_by}: destroyed {id}\n").as_bytes())
193 .unwrap();
194 }
195 }
196
197 fn connect(&self, connect_from: Id, connect_to: Id) {
198 if self.is_entity_enabled(connect_from, log::Level::Trace)
199 || self.is_entity_enabled(connect_to, log::Level::Trace)
200 {
201 self.writer
202 .borrow_mut()
203 .write_all(format!("{connect_from}: connect to {connect_to}\n").as_bytes())
204 .unwrap();
205 }
206 }
207
208 fn log(&self, id: Id, level: log::Level, msg: std::fmt::Arguments) {
209 if self.is_entity_enabled(id, level) {
210 self.writer
211 .borrow_mut()
212 .write_all(format!("{id}:{level}: {msg}\n").as_bytes())
213 .unwrap();
214 }
215 }
216
217 fn time(&self, set_by: Id, time_ns: f64) {
218 if self.is_entity_enabled(set_by, log::Level::Trace) {
219 self.writer
220 .borrow_mut()
221 .write_all(format!("{set_by}: set time to {time_ns:.1}ns\n").as_bytes())
222 .unwrap();
223 }
224 }
225
226 fn shutdown(&self) {
227 self.writer.borrow_mut().flush().unwrap();
228 }
229}