Skip to main content

co_identity/resolvers/
memory.rs

1// SPDX-License-Identifier: AGPL-3.0-only
2// Copyright (C) 2026 1io BRANDGUARDIAN GmbH
3
4use crate::{
5	Identity, IdentityBox, IdentityResolver, IdentityResolverError, PrivateIdentityBox, PrivateIdentityResolver,
6};
7use async_trait::async_trait;
8use co_primitives::Did;
9use std::{
10	collections::HashMap,
11	sync::{Arc, Mutex},
12};
13
14#[derive(Debug, Clone, Default)]
15pub struct MemoryIdentityResolver {
16	identites: Arc<Mutex<HashMap<Did, IdentityBox>>>,
17}
18impl MemoryIdentityResolver {
19	pub async fn insert(&mut self, identity: IdentityBox) {
20		self.identites.lock().unwrap().insert(identity.identity().to_owned(), identity);
21	}
22}
23#[async_trait]
24impl IdentityResolver for MemoryIdentityResolver {
25	async fn resolve(&self, identity: &str) -> Result<IdentityBox, IdentityResolverError> {
26		self.identites
27			.lock()
28			.unwrap()
29			.get(identity)
30			.cloned()
31			.ok_or(IdentityResolverError::NotFound)
32	}
33}
34
35#[derive(Debug, Clone, Default)]
36pub struct MemoryPrivateIdentityResolver {
37	identites: Arc<Mutex<HashMap<Did, PrivateIdentityBox>>>,
38}
39impl MemoryPrivateIdentityResolver {
40	pub fn from(iter: impl IntoIterator<Item = PrivateIdentityBox>) -> Self {
41		Self {
42			identites: Arc::new(Mutex::new(
43				iter.into_iter()
44					.map(|identity| (identity.identity().to_owned(), identity))
45					.collect(),
46			)),
47		}
48	}
49
50	pub async fn insert(&self, identity: PrivateIdentityBox) {
51		self.identites.lock().unwrap().insert(identity.identity().to_owned(), identity);
52	}
53}
54#[async_trait]
55impl PrivateIdentityResolver for MemoryPrivateIdentityResolver {
56	async fn resolve_private(&self, identity: &str) -> Result<PrivateIdentityBox, IdentityResolverError> {
57		self.identites
58			.lock()
59			.unwrap()
60			.get(identity)
61			.cloned()
62			.ok_or(IdentityResolverError::NotFound)
63	}
64}