net_literals_impl/
lib.rs

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