use std::io::Error;
use std::net::SocketAddr;
use socket2::{Domain, Protocol, Socket, Type};
use tokio::net::UdpSocket;
use tokio_stream::{Stream, StreamExt};
use tokio_util::udp::UdpFramed;
use crate::codec::F1Codec;
use crate::packet::Packet;
pub mod codec;
pub mod nineteen;
pub mod packet;
pub mod types;
pub struct F1 {}
impl F1 {
pub fn stream(socket_address: SocketAddr) -> Result<impl Stream<Item = Packet>, Error> {
let socket = match socket_address {
SocketAddr::V4(_) => Socket::new(Domain::IPV4, Type::DGRAM, Some(Protocol::UDP)),
SocketAddr::V6(_) => Socket::new(Domain::IPV6, Type::DGRAM, Some(Protocol::UDP)),
}?;
socket.bind(&socket_address.into())?;
Ok(UdpFramed::new(UdpSocket::from_std(socket.into())?, F1Codec)
.map(|result| result.unwrap())
.map(|(packet, _address)| packet))
}
}