0

I write some content into the file using this code in rust:

fn renderBody(w:&mut File,doc: &Vec<UserDictResponse>) {
    for word in doc {
        let word_content = format!("{}{}{}", r"\textbf{", word.word.to_string(),r"}");
        writeln!(w,"{}",word_content);
        writeln!(w,r"");
        let translate = format!("{}",word.translation.to_string());
        writeln!(w,"{}",translate);
        writeln!(w,r"");
        writeln!(w,r"\vspace{{12pt}}");
        writeln!(w,r"");
    }
}

when I compile this code, shows warning like this:

warning: unused `Result` that must be used
   --> src/service/word/user_dict_service.rs:116:9
    |
116 |         writeln!(w,r"\vspace{{12pt}}");
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = note: this `Result` may be an `Err` variant, which should be handled
    = note: this warning originates in the macro `writeln` (in Nightly builds, run with -Z macro-backtrace for more info)

warning: unused `Result` that must be used
   --> src/service/word/user_dict_service.rs:117:9
    |
117 |         writeln!(w,r"");
    |         ^^^^^^^^^^^^^^^^
    |
    = note: this `Result` may be an `Err` variant, which should be handled
    = note: this warning originates in the macro `writeln` (in Nightly builds, run with -Z macro-backtrace for more info)

I should handle the Err when using write? I did not return any Result, what should I do to handle the result properly? I make a minimal example like this:

use std::fs::File;
use std::io::Write;
fn main() {
    let path = "/home/dolphin/demo.tex";
    let mut file = File::create(path).unwrap();
    writeln!(&mut file, r"\documentclass[12pt]{{book}}").unwrap();
}

when I compile, it did not have warning. This makes me confusing.

Dolphin
  • 29,069
  • 61
  • 260
  • 539
  • Also, consider `writeln!(w, r"\textbf{{{}}} {} \vspace{{12pt}}", word.word, word.translation)?;` (with newlines) – Ry- Oct 30 '21 at 04:13
  • 1
    Another potential solution is provided here: [Unused `std::result::Result` that must be used when using writeln](https://stackoverflow.com/questions/63437768/unused-stdresultresult-that-must-be-used-when-using-writeln) – kmdreko Oct 30 '21 at 04:33

1 Answers1

1

.unwrap() will cause your program to panic if it fails to write to the file, which is potentially a valid thing to do – how errors should be handled is really up to you. So if you want to panic on every error, you can do like you did in the minimal example:

fn renderBody(w: &mut File, doc: &Vec<UserDictResponse>) {
    for word in doc {
        let word_content = format!("{}{}{}", r"\textbf{", word.word.to_string(), r"}");
        writeln!(w, "{}", word_content).unwrap();
        writeln!(w, r"").unwrap();
        let translate = format!("{}", word.translation.to_string());
        writeln!(w, "{}", translate).unwrap();
        writeln!(w, r"").unwrap();
        writeln!(w, r"\vspace{{12pt}}").unwrap();
        writeln!(w, r"").unwrap();
    }
}

But:

I did not return any Result, what should I do to handle the result properly?

You could change to returning a Result, return Err any time there’s an error writing to the file, and leave error handling to the caller. Even if you want to panic, this might be the cleaner option:

fn renderBody(w: &mut File, doc: &Vec<UserDictResponse>) -> Result<(), io::Error> {
    for word in doc {
        let word_content = format!("{}{}{}", r"\textbf{", word.word.to_string(), r"}");
        writeln!(w, "{}", word_content)?;
        writeln!(w, r"")?;
        let translate = format!("{}", word.translation.to_string());
        writeln!(w, "{}", translate)?;
        writeln!(w, r"")?;
        writeln!(w, r"\vspace{{12pt}}")?;
        writeln!(w, r"")?;
    }
    Ok(())
}

and then renderBody(…).unwrap();.

Ry-
  • 218,210
  • 55
  • 464
  • 476