Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Assigning returned value in a match arm to a new variable

I am working on my first Rust project, a CLI application to find large files on a local filesystem. Rust has excellent documentation regarding match statements but I do not see how I can assign a value returned by the function passed to the match statement in a new variable:

pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
    let mut results_map: Option<Results>;
    match search(&config.root_path) {
        Err(e) => eprintln!("Error when calling run(): {:?}", e),
        Ok(results) => results_map = results), // how to properly assign value returned by function here?
    }

    Ok(())
}

pub struct Results {
    result_map: HashMap<String, u64>,
}

pub fn search(path: &str) -> Result<Results, io::Error> {
    let root_path = Path::new(path);
    let mut results = Results { result_map: HashMap::<String, u64>::new()};


    match visit_dirs(root_path, &mut results) {
        Err(e) => eprintln!("Error calling visit_dirs() from search(): {:?}", e),
        _ => (),
    }

    Ok(results)
}

>Solution :

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

The functions you’re calling in the match statements, search and visit_dirs return Result types. You have to use one of the arms of the match statement to cover the Ok (happy) case, next to where you’re already covering the Err (error) case:

match search(&config.root_path) {
    Ok(results) => return results,
    Err(e) => eprintln!("Error when calling run(): {:?}", e),       
}

Or you can assign the result of the match expression to a new variable:

let new_variable = match search(&config.root_path) {
    Ok(results) => results, // no return here
    Err(e) => {
       eprintln!("Error when calling run(): {:?}", e)
       // Either choose to panic (not recommended)
       // panic!("Bad times lie ahead")
       // Or propagate the error from your own Result
       return Err(e);
    },       
}

You may want to look into the ? operator to simplify this in the common case.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading