2 unstable releases
Uses new Rust 2024
0.2.0 | May 7, 2025 |
---|---|
0.1.0 | May 7, 2025 |
#60 in #pointers
5,734 downloads per month
Used in 19 crates
(3 directly)
6KB
109 lines
arcref
A smart pointer type that can wrap either a &'static T
or an Arc<T>
.
See the examples/
folder for example usage.
lib.rs
:
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");