socket_addr_macros 1.0.1

Check and parse SocketAddr at compile-time
Documentation
use itertools::Itertools;
use proc_macro2::{TokenStream, TokenTree::*, Delimiter::*, Ident, Punct, Literal, Group};

pub trait Stringify {
    fn stringify(self) -> String;
}

impl Stringify for TokenStream {
    fn stringify(self) -> String {
        self
            .into_iter()
            .map(|tt| match tt {
                Group(group) => group.stringify(),
                Ident(ident) => ident.stringify(),
                Punct(punct) => punct.stringify(),
                Literal(literal) => literal.stringify(),
            })
            .join("")
    }
}

impl Stringify for Group {
    fn stringify(self) -> String {
        let inner = self.stream().stringify();

        match self.delimiter() {
            Parenthesis => format!("({inner})"),
            Brace => format!("{{{inner}}}"),
            Bracket => format!("[{inner}]"),
            None => inner,
        }
    }
}

macro_rules! impl_stringify {
    ($struct:ident) => {
        impl Stringify for $struct {
            fn stringify(self) -> String {
                self.to_string()
            }
        }
    };
}

impl_stringify!(Ident);
impl_stringify!(Punct);
impl_stringify!(Literal);