Add zero-cost builder methods to PathBuf

use std::path::PathBuf;

macro_rules! _path_parse_segment {
    /*
        LITERAL
    */
    ($buffer:expr; $($segment:tt)~* / $($rest:tt)*) => {{
        _path_parse_segment!($buffer; $($segment)~*);
        
        _path_parse_segment!($buffer; $($rest)*);
    }};
    ($buffer:expr; $($segment:tt)~*) => {{
        let mut segment = String::new();
        
        $(
            segment.push_str($segment);
        )*
        
        PathBuf::push($buffer, &*segment);
    }};
}

macro_rules! path {
    ($($t:tt)*) => {{
        let mut buffer = PathBuf::new();
        
        _path_parse_segment!(&mut buffer; $($t)*);
        
        buffer
    }}
}


fn user() -> &'static str {
    "Mokuz"
}

fn main() {
    let q = "quux";
    
    let p = path!("a" ~ q / "foo" / "." ~ (user()) / "file.txt" );
    
    assert_eq!(p, PathBuf::from("aquux/foo/.Mokuz/file.txt"));
}

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.