Skip Navigation

Allow argument in macro to be Option or T

Hey,

Is there any way to create a macro that allows a Some<T> or T as input?

It's for creating a Span struct that I'm using:

 rust
    
struct Span {
    line: usize,
    column: usize,
    file_path: Option<String>,
}

  

...and I have the following macro:

 rust
    
macro_rules! span {
    ($line:expr, $column:expr) => {
        Span {
            line: $line,
            column: $column
            file_path: None,
        }
    };

    ($line:expr, $column:expr, $file_path: expr) => {
        Span {
            line: $line,
            column: $column
            file_path: Some($file_path.to_string()),
        }
    };
}

  

...which allows me to do this:

 rust
    
let foo = span!(1, 1);
let bar = span!(1, 1, "file.txt");

  

However, sometimes I don't want to pass in the file path directly but through a variable that is Option

<String>

. To do this, I always have to match the variable:

 rust
    
let file_path = Some("file.txt");

let foo = match file_path {
    Some(file_path) => span!(1, 1, file_path),
    None => span!(1, 1),
}

  

Is there a way which allows me to directly use span!(1, 1, file_path) where file_path could be "file.txt", Some("file.txt") or None?

Thanks in advance!

Comments

16

Comments

16