#static #pointers #arc #arcref #arc-t

arcref

For when you need a pointer and don't care if it's &'static T or Arc<T>

2 unstable releases

Uses new Rust 2024

0.2.0 May 7, 2025
0.1.0 May 7, 2025

#60 in #pointers

Download history 2090/week @ 2025-05-05 3643/week @ 2025-05-12

5,734 downloads per month
Used in 19 crates (3 directly)

MIT license

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");

No runtime deps