fetchlike/
macros.rs

1#[macro_export]
2macro_rules! fetch_macro {
3    ($url:expr) => {
4        fetchlike::fetch(fetchlike::Request {
5            url: $url.parse()?,
6            ..Default::default()
7        })
8    };
9    ($url:expr, {$($tree:tt)+}) => {
10        {
11            let _method = fetchlike::Method::GET;
12            let _headers: Option<fetchlike::HeaderMap> = None;
13            let _body = fetchlike::Body::empty();
14            fetchlike::__parse_tree!(_method, _headers, _body, $($tree)+);
15
16            fetchlike::fetch(fetchlike::Request {
17                url: $url.parse()?,
18                method: _method,
19                headers: _headers,
20                body: _body
21            })
22        }
23    };
24}
25
26#[macro_export]
27macro_rules! __parse_tree {
28    ($method:ident, $headers:ident, $body:ident, headers: {$($field:tt: $value:expr),*}) => {
29        let $headers = {
30            let mut map = fetchlike::HeaderMap::new();
31            $(map.insert(
32                $field,
33                $value.parse()?,
34            );)*
35            Some(map)
36        };
37    };
38    ($method:ident, $headers:ident, $body:ident, headers: {$($field:tt: $value:expr),* $(,)*} $(,)*) => {
39        fetchlike::__parse_tree!($method, $headers, $body, headers: {$($field: $value),*});
40    };
41    ($method:ident, $headers:ident, $body:ident, headers: {$($field:tt: $value:expr),*}, $($tree:tt)+) => {
42        fetchlike::__parse_tree!($method, $headers, $body, headers: {$($field: $value),*});
43        fetchlike::__parse_tree!($method, $headers, $body, $($tree)+);
44    };
45
46    ($method:ident, $headers:ident, $body:ident, $field:ident: $value:expr) => {
47        fetchlike::__parse_field!($method, $headers, $body, $field: $value);
48    };
49    ($method:ident, $headers:ident, $body:ident, $field:ident: $value:expr $(,)*) => {
50        fetchlike::__parse_tree!($method, $headers, $body, $field: $value);
51    };
52    ($method:ident, $headers:ident, $body:ident, $field:ident: $value:expr, $($tree:tt)+) => {
53        fetchlike::__parse_tree!($method, $headers, $body, $field: $value);
54        fetchlike::__parse_tree!($method, $headers, $body, $($tree)+);
55    };
56}
57
58#[macro_export]
59macro_rules! __parse_field {
60    ($method:ident, $headers:ident, $body:ident, method: $value:expr) => {
61        let $method = fetchlike::Method::from_bytes($value.as_bytes())?;
62    };
63    ($method:ident, $headers:ident, $body:ident, body: $value:expr) => {
64        let $body = fetchlike::Body::from($value.to_string());
65    };
66}