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" );
}