Crate arcref

Source
Expand description

ArcRef<T> is a smart pointer type that can hold either a &'static T or an Arc<T>.

It’s especially helpful for composible plugin systems where some of the implementations are ZSTs or packaged with the core library, and the others are dynamically generated.

§Example usage:

use arcref::ArcRef;
use std::sync::Arc;

#[derive(Debug, Copy, Clone, PartialOrd, PartialEq)]
pub enum Level { INFO, WARN, ERROR }

pub trait Logger {
  fn log(&self, level: Level, line: &str) -> String;
}

pub struct ConsoleLogger;

impl Logger for ConsoleLogger {
  fn log(&self, level: Level, line: &str) -> String {
    format!("{level:?}: {line}")
  }
}

pub struct FilteredLogger {
  min_level: Level,
  delegate: ArcRef<dyn Logger>,
}

impl Logger for FilteredLogger {
  fn log(&self, level: Level, line: &str) -> String {
    if level >= self.min_level {
      self.delegate.log(level, line)
    } else {
      String::new()
    }
  }
}

let logger = ArcRef::new_arc(Arc::new(FilteredLogger {
  min_level: Level::WARN,
  delegate: ArcRef::new_ref(&ConsoleLogger),
}));

assert_eq!(logger.log(Level::INFO, "not printed"), String::new());
assert_eq!(logger.log(Level::WARN, "printed"), "WARN: printed");

Structs§

ArcRef
Either a reference-counted Arc or a static reference to a value.