1#[macro_use]
2extern crate proc_macro_hack;
3
4use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
5use std::net::{SocketAddr, SocketAddrV4, SocketAddrV6};
6use std::str::FromStr;
7
8fn destring(input: &str) -> &str {
9 let mut chars = input.chars();
10 if chars.next() != Some('"') || chars.next_back() != Some('"') {
11 panic!("Argument must be a string literal");
12 }
13 &input[1..(input.len() - 1)]
14}
15
16proc_macro_expr_impl! {
17 pub fn ip_impl(input: &str) -> String {
18 let ip = IpAddr::from_str(destring(input)).unwrap();
19 match ip {
20 IpAddr::V4(ipv4) => {
21 let octets = ipv4.octets();
22 format!("::std::net::IpAddr::V4(::std::net::Ipv4Addr::new({}, {}, {}, {}))",
23 octets[0], octets[1], octets[2], octets[3])
24 },
25 IpAddr::V6(ipv6) => {
26 let segments = ipv6.segments();
27 format!("::std::net::IpAddr::V6(::std::net::Ipv6Addr::new(\
28 {}, {}, {}, {}, {}, {}, {}, {}))",
29 segments[0], segments[1], segments[2], segments[3],
30 segments[4], segments[5], segments[6], segments[7])
31 }
32 }
33 }
34}
35
36proc_macro_expr_impl! {
37 pub fn ipv4_impl(input: &str) -> String {
38 let ipv4 = Ipv4Addr::from_str(destring(input)).unwrap();
39 let octets = ipv4.octets();
40 format!("::std::net::Ipv4Addr::new({}, {}, {}, {})",
41 octets[0], octets[1], octets[2], octets[3])
42 }
43}
44
45proc_macro_expr_impl! {
46 pub fn ipv6_impl(input: &str) -> String {
47 let ipv6 = Ipv6Addr::from_str(destring(input)).unwrap();
48 let segments = ipv6.segments();
49 format!("::std::net::Ipv6Addr::new(\
50 {}, {}, {}, {}, {}, {}, {}, {})",
51 segments[0], segments[1], segments[2], segments[3],
52 segments[4], segments[5], segments[6], segments[7])
53 }
54}
55
56proc_macro_expr_impl! {
57 pub fn addr_impl(input: &str) -> String {
58 let addr = SocketAddr::from_str(destring(input)).unwrap();
59 match addr {
60 SocketAddr::V4(addrv4) => {
61 let ipv4 = addrv4.ip();
62 let port = addrv4.port();
63 let octets = ipv4.octets();
64 format!("::std::net::SocketAddr::V4(\
65 ::std::net::SocketAddrV4::new(\
66 ::std::net::Ipv4Addr::new({}, {}, {}, {}), {}))",
67 octets[0], octets[1], octets[2], octets[3], port)
68 },
69 SocketAddr::V6(addrv6) => {
70 let ipv6 = addrv6.ip();
71 let port = addrv6.port();
72 let segments = ipv6.segments();
73 format!("::std::net::SocketAddr::V6(\
74 ::std::net::SocketAddrV6::new(\
75 ::std::net::Ipv6Addr::new(\
76 {}, {}, {}, {}, {}, {}, {}, {}), {}, 0, 0))",
77 segments[0], segments[1], segments[2], segments[3],
78 segments[4], segments[5], segments[6], segments[7],
79 port)
80 },
81 }
82 }
83}
84
85proc_macro_expr_impl! {
86 pub fn addrv4_impl(input: &str) -> String {
87 let addrv4 = SocketAddrV4::from_str(destring(input)).unwrap();
88 let ipv4 = addrv4.ip();
89 let port = addrv4.port();
90 let octets = ipv4.octets();
91 format!("::std::net::SocketAddrV4::new(\
92 ::std::net::Ipv4Addr::new({}, {}, {}, {}), {})",
93 octets[0], octets[1], octets[2], octets[3], port)
94 }
95}
96
97proc_macro_expr_impl! {
98 pub fn addrv6_impl(input: &str) -> String {
99 let addrv6 = SocketAddrV6::from_str(destring(input)).unwrap();
100 let ipv6 = addrv6.ip();
101 let port = addrv6.port();
102 let segments = ipv6.segments();
103 format!("::std::net::SocketAddrV6::new(\
104 ::std::net::Ipv6Addr::new(\
105 {}, {}, {}, {}, {}, {}, {}, {}), {}, 0, 0)",
106 segments[0], segments[1], segments[2], segments[3],
107 segments[4], segments[5], segments[6], segments[7],
108 port)
109 }
110}
111