3

I am currently struggling with a use case, where I want to achieve the following things:

This is a simplified version. Basically, I would have a macro to translate customized format to a function

example!(
    name, // is an ident, mandatory
    <expr1>, // is an expr, optional
    [expr2], // is an expr, optional
)

name(Some(expr1), Some(expr2)) // my_macro!(name, <expr1>, [expr2])
name(None, Some(expr2)) // my_macro!(name, [expr2])
name(Some(expr1), None) // my_macro!(name, <expr1>)
name(None, None) // my_macro!(name)

I know that I can define multiple patterns to represent cases 1 through 4 and give a proper template. However, if am wondering if there is a more intelligent way or some sys-builtin macros (e.g stringify!) which can handler something like:

#[macro_export]
macro_rules! example {
    ($name:ident, $(($expr1:expr)),? $([$expr2:expr]),?) => {

        let expr_1 = Some( $( $expr1 )? ) // or None
        let expr_2 = Some( $( $expr2 )? ) // or None

        name(expr_1, expr_2)
    }
}
John Kugelman
  • 349,597
  • 67
  • 533
  • 578
Polar Bear
  • 71
  • 1
  • 6

1 Answers1

3

I ended up with a solution by adding another macro rules:

#[macro_export]
macro_rules! some_or_none {
    () => { None };
    ($entity:expr) => { Some($entity) }
}

#[macro_export]
macro_rules! example {
    ($name:ident, $(<$expr1:tt>),? $([$expr2:tt]),?) => {

        let expr_1 = some_or_none!($expr1)
        let expr_2 = some_or_none!($expr2)

        $name(expr_1, expr_2)
    }
}

Polar Bear
  • 71
  • 1
  • 6