This repository has no description
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}