Adrian Heine
3 years ago
7 changed files with 246 additions and 143 deletions
-
3Cargo.toml
-
109src/setup/core.rs
-
21src/setup/runnable.rs
-
95src/setup/setup.rs
-
73src/setup/symbol_runner.rs
-
79src/setup/util.rs
-
7tests/setup.rs
@ -1,12 +1,85 @@ |
|||||
use crate::loggers::StoringLogger;
|
|
||||
use crate::resources::Resource;
|
use crate::resources::Resource;
|
||||
use crate::to_artifact::ToArtifact;
|
use crate::to_artifact::ToArtifact;
|
||||
|
use slog::Drain;
|
||||
|
use slog::{OwnedKVList, Record};
|
||||
|
use slog_async::AsyncRecord;
|
||||
|
use std::cell::RefCell;
|
||||
use std::error::Error;
|
use std::error::Error;
|
||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||
|
use std::io::{self, Write};
|
||||
|
use std::rc::Rc;
|
||||
|
use std::sync::{Arc, Mutex};
|
||||
|
|
||||
pub trait AddableResource: 'static + Resource + Debug {}
|
pub trait AddableResource: 'static + Resource + Debug {}
|
||||
impl<R> AddableResource for R where R: 'static + Resource + Debug {}
|
impl<R> AddableResource for R where R: 'static + Resource + Debug {}
|
||||
|
|
||||
pub type AddResult<R> = Result<(<R as ToArtifact>::Artifact, bool), Box<dyn Error>>;
|
pub type AddResult<R> = Result<(<R as ToArtifact>::Artifact, bool), Box<dyn Error>>;
|
||||
pub type InternalAddResult<R> =
|
|
||||
Result<(StoringLogger, <R as ToArtifact>::Artifact, bool), (StoringLogger, Box<dyn Error>)>;
|
|
||||
|
pub type InternalAddResult<R> = Result<(<R as ToArtifact>::Artifact, bool), Box<dyn Error>>;
|
||||
|
|
||||
|
// From https://users.rust-lang.org/t/how-to-send-a-writer-into-a-thread/4965/10
|
||||
|
#[derive(Clone)]
|
||||
|
struct Output<W>(Rc<RefCell<W>>);
|
||||
|
|
||||
|
impl<W: Write> Output<W> {
|
||||
|
pub fn new(w: W) -> Self {
|
||||
|
Self(Rc::new(RefCell::new(w)))
|
||||
|
}
|
||||
|
}
|
||||
|
|
||||
|
impl<W: Write> Write for Output<W> {
|
||||
|
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
|
||||
|
self.0.borrow_mut().write(buf)
|
||||
|
}
|
||||
|
|
||||
|
fn flush(&mut self) -> io::Result<()> {
|
||||
|
self.0.borrow_mut().flush()
|
||||
|
}
|
||||
|
}
|
||||
|
|
||||
|
#[derive(Clone, Default)]
|
||||
|
pub struct Recorder(Arc<Mutex<Vec<AsyncRecord>>>);
|
||||
|
|
||||
|
impl Drain for Recorder {
|
||||
|
type Ok = ();
|
||||
|
type Err = slog::Never;
|
||||
|
|
||||
|
fn log(&self, record: &Record<'_>, logger_values: &OwnedKVList) -> Result<Self::Ok, Self::Err> {
|
||||
|
self
|
||||
|
.0
|
||||
|
.lock()
|
||||
|
.unwrap()
|
||||
|
.push(AsyncRecord::from(record, logger_values));
|
||||
|
Ok(())
|
||||
|
}
|
||||
|
}
|
||||
|
|
||||
|
impl Recorder {
|
||||
|
pub fn to_string(&self, filter_level: slog::Level) -> String {
|
||||
|
let output = Output::new(vec![]);
|
||||
|
{
|
||||
|
let decorator = slog_term::PlainDecorator::new(output.clone());
|
||||
|
let drain = slog_term::CompactFormat::new(decorator).build();
|
||||
|
for record in &*self.0.lock().unwrap() {
|
||||
|
record.as_record_values(|record, kv| {
|
||||
|
if record.level() <= filter_level {
|
||||
|
drain.log(record, kv).unwrap();
|
||||
|
}
|
||||
|
});
|
||||
|
}
|
||||
|
}
|
||||
|
String::from_utf8(Rc::try_unwrap(output.0).unwrap().into_inner())
|
||||
|
.expect("Record output should be valid UTF-8")
|
||||
|
}
|
||||
|
}
|
||||
|
|
||||
|
#[cfg(test)]
|
||||
|
mod test {
|
||||
|
use super::Recorder;
|
||||
|
use slog::Level;
|
||||
|
|
||||
|
#[test]
|
||||
|
fn records_no_output() {
|
||||
|
let recorder = Recorder::default();
|
||||
|
assert_eq!(recorder.to_string(Level::Trace), "");
|
||||
|
}
|
||||
|
}
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue