pub mod control;
pub mod floodsub;
pub mod protocol;
pub mod subscription;
use futures::channel::{mpsc, oneshot};
use libp2prs_core::PeerId;
use std::{
error,
fmt::{Display, Result},
io,
};
mod rpc_proto {
include!(concat!(env!("OUT_DIR"), "/floodsub.pb.rs"));
}
const FLOOD_SUB_ID: &[u8] = b"/floodsub/1.0.0";
#[derive(Clone)]
pub struct FloodsubConfig {
pub local_peer_id: PeerId,
pub subscribe_local_messages: bool,
}
impl FloodsubConfig {
pub fn new(local_peer_id: PeerId) -> Self {
Self {
local_peer_id,
subscribe_local_messages: false,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Topic(String);
impl Topic {
#[inline]
pub fn id(&self) -> &str {
&self.0
}
pub fn is_empty(&self) -> bool {
self.0 == ""
}
pub fn new<S>(name: S) -> Topic
where
S: Into<String>,
{
Topic(name.into())
}
}
impl From<Topic> for String {
fn from(topic: Topic) -> String {
topic.0
}
}
#[derive(Debug)]
pub enum FloodsubError {
Io(io::Error),
Closed,
}
impl error::Error for FloodsubError {
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
match self {
FloodsubError::Io(err) => Some(err),
FloodsubError::Closed => None,
}
}
}
impl Display for FloodsubError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result {
match self {
FloodsubError::Io(e) => write!(f, "i/o error: {}", e),
FloodsubError::Closed => f.write_str("floodsub protocol is closed"),
}
}
}
impl From<io::Error> for FloodsubError {
fn from(e: io::Error) -> Self {
FloodsubError::Io(e)
}
}
impl From<mpsc::SendError> for FloodsubError {
fn from(_: mpsc::SendError) -> Self {
FloodsubError::Closed
}
}
impl From<oneshot::Canceled> for FloodsubError {
fn from(_: oneshot::Canceled) -> Self {
FloodsubError::Closed
}
}