diff --git a/knot2/crates/knot-index/src/intern.rs b/knot2/crates/knot-index/src/intern.rs
--- a/knot2/crates/knot-index/src/intern.rs
+++ b/knot2/crates/knot-index/src/intern.rs
@@ -1,6 +1,6 @@
use std::sync::Arc;
-use knot_types::{AccountDid, OwnerDid, RepoDid, RepoRkey};
+use knot_types::{AccountDid, OwnerDid, RepoDid, RepoName, RepoRkey};
use lasso::{Spur, ThreadedRodeo};
#[derive(Debug, Clone, Default)]
@@ -13,11 +13,7 @@
}
macro_rules! interned {
- ($(
- $key:ident of $value:ty {
- $intern:ident, $get:ident, $resolve:ident, $label:literal
- }
- )+) => {$(
+ (@lookup $key:ident of $value:ty { $intern:ident, $get:ident }) => {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub(crate) struct $key(Spur);
@@ -29,12 +25,23 @@
pub(crate) fn $get(&self, value: &$value) -> Option<$key> {
self.0.get(value.as_str()).map($key)
}
-
- pub(crate) fn $resolve(&self, key: $key) -> $value {
- <$value>::new(self.0.resolve(&key.0))
- .expect(concat!("interned ", $label, " is valid ", $label))
- }
}
+ };
+ ($(
+ $key:ident of $value:ty {
+ $intern:ident, $get:ident $(, $resolve:ident, $label:literal)?
+ }
+ )+) => {$(
+ interned!(@lookup $key of $value { $intern, $get });
+
+ $(
+ impl Interner {
+ pub(crate) fn $resolve(&self, key: $key) -> $value {
+ <$value>::new(self.0.resolve(&key.0))
+ .expect(concat!("interned ", $label, " is valid ", $label))
+ }
+ }
+ )?
)+};
}
@@ -43,4 +50,5 @@
RepoKey of RepoDid { intern_repo, repo, resolve_repo, "repo DID" }
OwnerKey of OwnerDid { intern_owner, owner, resolve_owner, "owner DID" }
RkeyKey of RepoRkey { intern_rkey, rkey, resolve_rkey, "rkey" }
+ NameKey of RepoName { intern_name, name }
}
diff --git a/knot2/crates/knot-index/src/lib.rs b/knot2/crates/knot-index/src/lib.rs
--- a/knot2/crates/knot-index/src/lib.rs
+++ b/knot2/crates/knot-index/src/lib.rs
@@ -16,7 +16,7 @@
MembersCob, RegistryChange, RepoRegistryCob,
};
use knot_git::{Layout, Repo};
-use knot_types::{AccountDid, OwnerDid, RepoDid, RepoRkey};
+use knot_types::{AccountDid, ClonePath, OwnerDid, RepoDid, RepoRkey};
use intern::Interner;
use projections::{CollaboratorsProjection, GrantSetProjection, KeyProjection, RegistryProjection};
@@ -197,6 +197,15 @@
pub fn resolve_repo(&self, owner: &OwnerDid, rkey: &RepoRkey) -> Resolved