use crate::codec::F1Codec;
use crate::packet::Packet;
use net2::UdpBuilder;
use std::io::Error;
use std::net::SocketAddr;
use tokio::net::UdpSocket;
use tokio::stream::{Stream, StreamExt};
use tokio_util::udp::UdpFramed;
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(address) => UdpBuilder::new_v4()?.bind(address),
SocketAddr::V6(address) => UdpBuilder::new_v6()?.only_v6(true)?.bind(address),
}?;
Ok(UdpFramed::new(UdpSocket::from_std(socket)?, F1Codec)
.map(|result| result.unwrap())
.map(|(packet, _address)| packet))
}
}