use error_tools::typed::Error;
use error_tools::dependency::thiserror;
use std::path::PathBuf;
#[ derive( Debug, Error ) ]
pub enum DataError
{
#[ error( "I/O error for file: {0}" ) ]
Io( std::io::Error, PathBuf ),
#[ error( "Parsing error: {0}" ) ]
Parse( String ),
}
impl From< std::io::Error > for DataError
{
fn from( err : std::io::Error ) -> Self
{
DataError::Io( err, PathBuf::new() )
}
}
fn process_data( path : &PathBuf ) -> Result< i32, DataError >
{
let content = std::fs::read_to_string( path )
.map_err( | e | DataError::Io( e, path.clone() ) )?;
content.trim().parse::< i32 >()
.map_err( | _ | DataError::Parse( "Could not parse content as integer".into() ) )
}
fn main()
{
_ = std::fs::write( "data.txt", "123" );
_ = std::fs::write( "invalid_data.txt", "abc" );
let path1 = PathBuf::from( "data.txt" );
match process_data( &path1 )
{
Ok( num ) => println!( "Processed data: {num}" ),
Err( e ) => println!( "An error occurred: {e}" ),
}
let path2 = PathBuf::from( "invalid_data.txt" );
match process_data( &path2 )
{
Ok( _ ) => (),
Err( e ) => println!( "Correctly handled parsing error: {e}" ),
}
_ = std::fs::remove_file( "data.txt" );
_ = std::fs::remove_file( "invalid_data.txt" );
}