use crate::utils::Vec;
use crate::{Key, KeyError, KeyRing, KeySerialId, KeyType, Metadata};
use core::cmp::PartialEq;
use core::ops::Deref;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum LinkNode {
KeyRing(KeyRing),
Key(Key),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Links(Vec<LinkNode>);
impl PartialEq<Key> for LinkNode {
fn eq(&self, other: &Key) -> bool {
matches!(self, LinkNode::Key(x) if x == other)
}
}
impl PartialEq<Key> for &LinkNode {
fn eq(&self, other: &Key) -> bool {
matches!(self, LinkNode::Key(x) if x == other)
}
}
impl PartialEq<KeyRing> for LinkNode {
fn eq(&self, other: &KeyRing) -> bool {
matches!(self, LinkNode::KeyRing(x) if x == other)
}
}
impl PartialEq<KeyRing> for &LinkNode {
fn eq(&self, other: &KeyRing) -> bool {
matches!(self, LinkNode::KeyRing(x) if x == other)
}
}
impl LinkNode {
pub(crate) fn from_id(id: KeySerialId) -> Result<Self, KeyError> {
let metadata = Metadata::from_id(id)?;
let node = match metadata.get_type() {
KeyType::KeyRing => Self::KeyRing(KeyRing::from_id(id)),
KeyType::User => Self::Key(Key::from_id(id)),
_ => return Err(KeyError::OperationNotSupported),
};
Ok(node)
}
pub fn as_key(&self) -> Option<Key> {
match self {
Self::Key(inner) => Some(*inner),
_ => None,
}
}
pub fn as_ring(&self) -> Option<KeyRing> {
match self {
Self::KeyRing(inner) => Some(*inner),
_ => None,
}
}
}
impl Deref for Links {
type Target = Vec<LinkNode>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl FromIterator<LinkNode> for Links {
fn from_iter<T>(iter: T) -> Self
where
T: IntoIterator<Item = LinkNode>,
{
Self(iter.into_iter().collect())
}
}
impl Links {
pub fn new(inner: Vec<LinkNode>) -> Self {
Self(inner)
}
pub fn get<T>(&self, entry: &T) -> Option<&LinkNode>
where
LinkNode: PartialEq<T>,
{
self.0.iter().find(|v| *v == entry)
}
pub fn contains<T>(&self, entry: &T) -> bool
where
LinkNode: PartialEq<T>,
{
self.0.iter().any(|v| v == entry)
}
}