vite_rs_dev_server/
util.rs1use std::{
2 net::{Ipv4Addr, Ipv6Addr, SocketAddrV4, SocketAddrV6, TcpListener, ToSocketAddrs},
3 ops::Range,
4};
5
6fn test_bind<A: ToSocketAddrs>(addr: A) -> bool {
7 TcpListener::bind(addr)
8 .map(|t| t.local_addr().is_ok())
9 .unwrap_or(false)
10}
11
12pub fn is_port_free(port: u16) -> bool {
13 let ipv4 = SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, port);
14 let ipv6 = SocketAddrV6::new(Ipv6Addr::UNSPECIFIED, port, 0, 0);
15
16 test_bind(ipv6) && test_bind(ipv4)
17}
18
19pub fn find_free_port(mut range: Range<u16>) -> Option<u16> {
20 range.find(|port| is_port_free(*port))
21}