1#![feature(error_generic_member_access)]
2
3use std::{backtrace::Backtrace, net::SocketAddr};
4
5use fast_socks5::{ReplyError, server::SocksServerError, util::target_addr::TargetAddr as SocksTargetAddr};
6use snafu::{IntoError, Snafu};
7use wind_core::types::TargetAddr;
8
9pub mod ext;
10pub mod inbound;
11pub mod udp;
12
13#[derive(Debug, Snafu)]
14#[snafu(visibility(pub))]
15pub enum Error {
16 BindSocket {
17 socket_addr: SocketAddr,
18 source: std::io::Error,
19 backtrace: Backtrace,
20 },
21 Io {
22 source: std::io::Error,
24 backtrace: Backtrace,
25 },
26 Socks {
27 #[snafu(provide)]
28 source: SocksServerError,
29 backtrace: Backtrace,
30 },
31 SocksReply {
32 #[snafu(provide)]
33 source: ReplyError,
34 backtrace: Backtrace,
35 },
36 Callback {
37 #[snafu(provide)]
38 source: eyre::Report,
39 backtrace: Backtrace,
40 },
41}
42
43impl From<SocksServerError> for Error {
44 #[inline(always)]
45 fn from(value: SocksServerError) -> Self {
46 SocksSnafu.into_error(value)
47 }
48}
49
50impl From<ReplyError> for Error {
51 #[inline(always)]
52 fn from(value: ReplyError) -> Self {
53 SocksReplySnafu.into_error(value)
54 }
55}
56
57pub fn convert_addr(addr: &SocksTargetAddr) -> TargetAddr {
58 match addr {
59 SocksTargetAddr::Domain(domain, port) => TargetAddr::Domain(domain.clone(), *port),
60 SocksTargetAddr::Ip(socket_addr) => match socket_addr.ip() {
61 std::net::IpAddr::V4(ipv4) => TargetAddr::IPv4(ipv4, socket_addr.port()),
62 std::net::IpAddr::V6(ipv6) => TargetAddr::IPv6(ipv6, socket_addr.port()),
63 },
64 }
65}