use std::fmt;
use nostr::event::Event;
use nostr::message::SubscriptionId;
use nostr::types::RelayUrl;
use crate::error::Error;
use crate::future::BoxedFuture;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum AdmitStatus {
Success,
Rejected {
reason: Option<String>,
},
}
impl AdmitStatus {
#[inline]
pub fn success() -> Self {
Self::Success
}
#[inline]
pub fn rejected<S>(reason: S) -> Self
where
S: Into<String>,
{
Self::Rejected {
reason: Some(reason.into()),
}
}
}
pub trait AdmitPolicy: fmt::Debug + Send + Sync {
fn admit_relay<'a>(
&'a self,
relay_url: &'a RelayUrl,
) -> BoxedFuture<'a, Result<AdmitStatus, Error>> {
let _ = relay_url;
Box::pin(async move { Ok(AdmitStatus::Success) })
}
fn admit_connection<'a>(
&'a self,
relay_url: &'a RelayUrl,
) -> BoxedFuture<'a, Result<AdmitStatus, Error>> {
let _ = relay_url;
Box::pin(async move { Ok(AdmitStatus::Success) })
}
fn admit_auth<'a>(
&'a self,
relay_url: &'a RelayUrl,
) -> BoxedFuture<'a, Result<AdmitStatus, Error>> {
let _ = relay_url;
Box::pin(async move { Ok(AdmitStatus::Success) })
}
fn admit_event<'a>(
&'a self,
relay_url: &'a RelayUrl,
subscription_id: &'a SubscriptionId,
event: &'a Event,
) -> BoxedFuture<'a, Result<AdmitStatus, Error>> {
let _ = (relay_url, subscription_id, event);
Box::pin(async move { Ok(AdmitStatus::Success) })
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_admit_status_success() {
let status = AdmitStatus::success();
assert_eq!(status, AdmitStatus::Success);
}
#[test]
fn test_admit_status_rejcted() {
let status = AdmitStatus::rejected("not admitted");
assert_eq!(
status,
AdmitStatus::Rejected {
reason: Some(String::from("not admitted"))
}
);
}
}