use alloc::vec::Vec;
use core::fmt;
use crate::{Event, Kind, PublicKey, Tag, UncheckedUrl};
#[derive(Debug)]
pub enum Error {
InvalidLength,
InvalidKind,
IdentifierTagNotFound,
MismatchedBadgeDefinitionOrAward,
BadgeAwardsLackAwardedPublicKey,
BadgeAwardMissingATag,
}
#[cfg(feature = "std")]
impl std::error::Error for Error {}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::InvalidLength => write!(f, "invalid length"),
Self::InvalidKind => write!(f, "invalid kind"),
Self::IdentifierTagNotFound => write!(f, "identifier tag not found"),
Self::MismatchedBadgeDefinitionOrAward => write!(f, "mismatched badge definition/award"),
Self::BadgeAwardsLackAwardedPublicKey => write!(f, "badge award events lack the awarded public keybadge award events lack the awarded public key"),
Self::BadgeAwardMissingATag => write!(f, "badge award event lacks `a` tag"),
}
}
}
pub(crate) fn filter_for_kind(events: Vec<Event>, kind_needed: &Kind) -> Vec<Event> {
events
.into_iter()
.filter(|e| e.kind() == *kind_needed)
.collect()
}
pub(crate) fn extract_awarded_public_key(
tags: &[Tag],
awarded_public_key: &PublicKey,
) -> Option<(PublicKey, Option<UncheckedUrl>)> {
tags.iter().find_map(|t| match t {
Tag::PublicKey {
public_key,
relay_url,
..
} if public_key == awarded_public_key => Some((*public_key, relay_url.clone())),
_ => None,
})
}