use crate::{Token, TokenId};
use super::TokenStore;
#[derive(Debug)]
pub enum Entry<'a, S>
where
S: TokenStore<'a>,
{
Occupied(OccupiedEntry<'a>),
Vacant(VacantEntry<'a, S>),
}
impl<'a, S> Entry<'a, S>
where
S: TokenStore<'a>,
{
pub fn new(chain_id: u64, id: TokenId, store: &'a mut S) -> Self {
if store.contains(chain_id, id.clone()) {
Self::Occupied(OccupiedEntry::new(chain_id, id, store))
} else {
Self::Vacant(VacantEntry::new(chain_id, id, store))
}
}
}
#[derive(Debug)]
pub struct OccupiedEntry<'a> {
value: &'a mut Token,
}
impl<'a> OccupiedEntry<'a> {
pub fn new<S>(chain_id: u64, id: TokenId, store: &'a mut S) -> Self
where
S: TokenStore<'a>,
{
Self {
value: store.get_mut(chain_id, id).unwrap(),
}
}
pub const fn get(&self) -> &Token {
self.value
}
pub const fn get_mut(&mut self) -> &mut Token {
self.value
}
pub const fn into_mut(self) -> &'a mut Token {
self.value
}
}
#[derive(Debug)]
pub struct VacantEntry<'a, S>
where
S: TokenStore<'a>,
{
chain_id: u64,
id: TokenId,
store: &'a mut S,
}
impl<'a, S> VacantEntry<'a, S>
where
S: TokenStore<'a>,
{
pub const fn new(chain_id: u64, id: TokenId, store: &'a mut S) -> Self {
Self {
chain_id,
id,
store,
}
}
pub const fn id(&self) -> &TokenId {
&self.id
}
pub const fn chain_id(&self) -> u64 {
self.chain_id
}
pub fn insert(self, token: Token) -> &'a mut Token {
self.store.insert(self.chain_id, token);
self.store.get_mut(self.chain_id, self.id.clone()).unwrap()
}
}