use core::future::Future;
use std::num::NonZero;
use le_stream::ToLeStream;
use crate::frame::Parameter;
use crate::parameters::configuration::version;
use crate::{Connection, Error, Parameters};
pub trait Transport: Send {
fn connect(&mut self) -> impl Future<Output = Result<version::Response, Error>> + Send;
fn state(&self) -> Connection;
fn negotiated_version(&self) -> Option<NonZero<u8>>;
fn send<T>(&mut self, command: T) -> impl Future<Output = Result<u16, Error>> + Send
where
T: Parameter + ToLeStream;
fn receive<T>(&mut self) -> impl Future<Output = Result<T, Error>> + Send
where
T: TryFrom<Parameters> + Send,
<T as TryFrom<Parameters>>::Error: Into<Parameters> + Send;
}