use crate::{HStrace, TraceOptions, TraceType};
pub struct HStraceBuilder {
trace_type: Option<TraceType>,
tracing_options: TraceOptions,
exit_receiver: Option<crossbeam_channel::Receiver<()>>,
}
impl HStraceBuilder {
pub fn new() -> Self {
Self {
trace_type: None,
tracing_options: TraceOptions::default(),
exit_receiver: None,
}
}
pub fn program(mut self, program: &str) -> Self {
self.trace_type = Some(TraceType::Program(program.to_string(), Vec::new()));
self
}
pub fn arg(self, arg: &str) -> Self {
self.args(vec![arg.to_owned()])
}
pub fn args(mut self, args: Vec<String>) -> Self {
match &self.trace_type {
Some(tt) => match tt {
TraceType::Program(prog, _) => {
self.trace_type = Some(TraceType::Program(prog.clone(), args.clone()));
}
_ => (),
},
None => (),
}
return self;
}
pub fn pid(mut self, pid: usize) -> Self {
self.trace_type = Some(TraceType::Pid(pid));
self
}
pub fn options(mut self, options: TraceOptions) -> Self {
self.tracing_options = options;
self
}
pub fn set_exit_receiver(mut self, set_exit_receiver: crossbeam_channel::Receiver<()>) -> Self {
self.exit_receiver = Some(set_exit_receiver);
self
}
pub fn build(self) -> HStrace {
HStrace::new(
self.trace_type.unwrap(),
self.tracing_options,
self.exit_receiver,
)
}
}