use alloc::string::String;
use core::{ops, str, time::Duration};
use futures::prelude::*;
use smoldot::libp2p::peer_id::PeerId;
pub mod async_std;
pub trait Platform: Send + 'static {
type Delay: Future<Output = ()> + Unpin + Send + 'static;
type Instant: Clone
+ ops::Add<Duration, Output = Self::Instant>
+ ops::Sub<Self::Instant, Output = Duration>
+ PartialOrd
+ Ord
+ PartialEq
+ Eq
+ Send
+ Sync
+ 'static;
type Connection: Send + Sync + 'static;
type Stream: Send + 'static;
type ConnectFuture: Future<Output = Result<PlatformConnection<Self::Stream, Self::Connection>, ConnectError>>
+ Unpin
+ Send
+ 'static;
type StreamDataFuture: Future<Output = ()> + Unpin + Send + 'static;
type NextSubstreamFuture: Future<Output = Option<(Self::Stream, PlatformSubstreamDirection)>>
+ Unpin
+ Send
+ 'static;
fn now_from_unix_epoch() -> Duration;
fn now() -> Self::Instant;
fn sleep(duration: Duration) -> Self::Delay;
fn sleep_until(when: Self::Instant) -> Self::Delay;
fn connect(url: &str) -> Self::ConnectFuture;
fn open_out_substream(connection: &mut Self::Connection);
fn next_substream(connection: &mut Self::Connection) -> Self::NextSubstreamFuture;
fn wait_more_data(stream: &mut Self::Stream) -> Self::StreamDataFuture;
fn read_buffer(stream: &mut Self::Stream) -> Option<&[u8]>;
fn advance_read_cursor(stream: &mut Self::Stream, bytes: usize);
fn send(stream: &mut Self::Stream, data: &[u8]);
}
#[derive(Debug)]
pub enum PlatformConnection<TStream, TConnection> {
SingleStream(TStream),
MultiStream(TConnection, PeerId),
}
#[derive(Debug)]
pub enum PlatformSubstreamDirection {
Inbound,
Outbound,
}
pub struct ConnectError {
pub message: String,
pub is_bad_addr: bool,
}