Skip to main content

gwr_track/tracker/
text.rs

1// Copyright (c) 2020 Graphcore Ltd. All rights reserved.
2
3use 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
14/// A simple text logger to output messages to a Writer.
15pub struct TextTracker {
16    entity_manager: EntityManager,
17
18    /// Writer to which all _log_ events will be written.
19    writer: SharedWriter,
20}
21
22impl TextTracker {
23    /// Create a new [`TextTracker`] with an [`EntityManager`].
24    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
32/// Implementation for each [`Track`] event
33impl 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}