Hone logo
Hone
Problems

Robust File Processing with Rust Error Handling

This challenge will guide you through implementing robust error handling in Rust for a common scenario: reading and parsing data from a file. You'll learn how to gracefully manage potential issues like file not found, permission errors, or invalid data formats, ensuring your program behaves predictably and informatively.

Problem Description

Your task is to create a Rust function that reads a file containing comma-separated integer values, parses these values, and returns them as a Vec<i32>. Crucially, your function must handle various potential errors that can occur during this process, such as:

  • File Not Found: The specified file does not exist.
  • Permission Denied: The program does not have read permissions for the file.
  • IO Errors: Other general input/output errors (e.g., disk full).
  • Parse Errors: The content of the file is not a valid integer.
  • Empty File: The file exists but contains no data.

Your function should return a Result<Vec<i32>, String> where:

  • On success, it returns Ok(Vec<i32>) containing the parsed integers.
  • On failure, it returns Err(String) with a descriptive error message explaining what went wrong.

Key Requirements:

  1. Function Signature: Define a function process_integer_file(filepath: &str) -> Result<Vec<i32>, String>.
  2. File Reading: Open and read the contents of the file specified by filepath.
  3. Data Parsing: Split the file content by commas, parse each part into an i32.
  4. Error Reporting: For each potential error identified above, return a distinct and informative error message.
  5. Empty File Handling: If the file is empty (but readable), return an Ok(Vec::new()).

Examples

Example 1:

Input: filepath = "data/numbers.txt" data/numbers.txt contains:

10,20,30,40

Output:

Ok([10, 20, 30, 40])

Explanation: The file is read successfully, and the comma-separated integers are parsed correctly.

Example 2:

Input: filepath = "nonexistent_file.txt"

Output:

Err("Failed to open file: nonexistent_file.txt. Error: No such file or directory (os error 2)")

Explanation: The file does not exist, so an error indicating "No such file or directory" is returned.

Example 3:

Input: filepath = "data/invalid_data.txt" data/invalid_data.txt contains:

10,abc,30

Output:

Err("Failed to parse integer: abc. Invalid digit found in string")

Explanation: The file reading is successful, but one of the values ("abc") cannot be parsed into an integer, triggering a parse error.

Example 4:

Input: filepath = "data/empty.txt" data/empty.txt contains:

Output:

Ok([])

Explanation: The file exists and is readable but empty. An empty vector is returned.

Constraints

  • The filepath will be a valid UTF-8 string.
  • The file content, if not empty, will consist of integers separated by commas, potentially with leading/trailing whitespace around numbers.
  • The maximum number of integers in a file is not strictly limited, but your solution should be reasonably efficient.
  • Error messages should be clear and include context about the failure.

Notes

Consider using Rust's Result enum and its combinator methods (like map_err, and_then, ? operator) to chain operations and propagate errors effectively. Think about how to convert different types of errors (e.g., std::io::Error) into the String error type required by the function signature. You might want to create helper functions or use match statements to handle specific error conditions.

Loading editor...
rust