This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

core / knot2 / crates / knot-index / src / intern.rs
1.4 kB 46 lines
1use std::sync::Arc; 2 3use knot_types::{AccountDid, OwnerDid, RepoDid, RepoRkey}; 4use lasso::{Spur, ThreadedRodeo}; 5 6#[derive(Debug, Clone, Default)] 7pub(crate) struct Interner(Arc<ThreadedRodeo>); 8 9impl Interner { 10 pub(crate) fn new() -> Self { 11 Self(Arc::new(ThreadedRodeo::new())) 12 } 13} 14 15macro_rules! interned { 16 ($( 17 $key:ident of $value:ty { 18 $intern:ident, $get:ident, $resolve:ident, $label:literal 19 } 20 )+) => {$( 21 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] 22 pub(crate) struct $key(Spur); 23 24 impl Interner { 25 pub(crate) fn $intern(&self, value: &$value) -> $key { 26 $key(self.0.get_or_intern(value.as_str())) 27 } 28 29 pub(crate) fn $get(&self, value: &$value) -> Option<$key> { 30 self.0.get(value.as_str()).map($key) 31 } 32 33 pub(crate) fn $resolve(&self, key: $key) -> $value { 34 <$value>::new(self.0.resolve(&key.0)) 35 .expect(concat!("interned ", $label, " is valid ", $label)) 36 } 37 } 38 )+}; 39} 40 41interned! { 42 AccountKey of AccountDid { intern_account, account, resolve_account, "account DID" } 43 RepoKey of RepoDid { intern_repo, repo, resolve_repo, "repo DID" } 44 OwnerKey of OwnerDid { intern_owner, owner, resolve_owner, "owner DID" } 45 RkeyKey of RepoRkey { intern_rkey, rkey, resolve_rkey, "rkey" } 46}