+
+ /// Syslog facility to use
+ #[structopt(long, parse(try_from_str=parse_syslog_facility))]
+ syslog_facility: Option<syslog::Facility>,
+}
+
+#[throws(AE)]
+fn parse_syslog_facility(s: &str) -> syslog::Facility {
+ s.parse().map_err(|()| anyhow!("unrecognised syslog facility: {:?}", s))?
+}
+
+#[derive(Debug)]
+struct FilteringLogWrapper<T>(T);
+
+impl<T> FilteringLogWrapper<T> {
+ fn wanted(&self, md: &log::Metadata<'_>) -> bool {
+ let first = |mod_path| {
+ let mod_path: &str = mod_path; // can't do in args as breaks lifetimes
+ mod_path.split_once("::").map(|s| s.0).unwrap_or(mod_path)
+ };
+ first(md.target()) == first(module_path!())
+ }
+}
+
+impl<T> log::Log for FilteringLogWrapper<T> where T: log::Log {
+ fn enabled(&self, md: &log::Metadata<'_>) -> bool {
+ self.wanted(md) && self.0.enabled(md)
+ }
+
+ fn log(&self, record: &log::Record<'_>) {
+ if self.wanted(record.metadata()) {
+ self.0.log(record)
+ }
+ }
+
+ fn flush(&self) {
+ self.0.flush()
+ }