@@ -13,27 +13,22 @@ extern crate plib;
1313use  clap:: Parser ; 
1414use  gettextrs:: { bind_textdomain_codeset,  textdomain} ; 
1515use  plib:: PROJECT_NAME ; 
16- use  std:: fs ; 
17- use  std:: io :: { self ,   BufRead ,   Read } ; 
16+ use  std:: io :: { self ,   BufRead } ; 
17+ use  std:: path :: PathBuf ; 
1818use  topological_sort:: TopologicalSort ; 
1919
2020/// tsort - topological sort 
2121#[ derive( Parser ,  Debug ) ]  
2222#[ command( author,  version,  about,  long_about) ]  
2323struct  Args  { 
2424    /// File to read as input. 
25- file :  Option < String > , 
25+ file :  Option < PathBuf > , 
2626} 
2727
28- fn  tsort_file ( filename :  & str )  -> io:: Result < ( ) >  { 
29-     let  file:  Box < dyn  Read > ; 
30-     if  filename == ""  { 
31-         file = Box :: new ( io:: stdin ( ) . lock ( ) ) ; 
32-     }  else  { 
33-         file = Box :: new ( fs:: File :: open ( filename) ?) ; 
34-     } 
35- 
28+ fn  tsort_file ( pathname :  & Option < PathBuf > )  -> io:: Result < ( ) >  { 
29+     let  file = plib:: io:: input_stream_opt ( pathname) ?; 
3630    let  mut  reader = io:: BufReader :: new ( file) ; 
31+ 
3732    let  mut  ts = TopologicalSort :: < String > :: new ( ) ; 
3833    let  mut  sv:  Vec < String >  = Vec :: new ( ) ; 
3934
@@ -65,6 +60,13 @@ fn tsort_file(filename: &str) -> io::Result<()> {
6560    Ok ( ( ) ) 
6661} 
6762
63+ fn  pathname_display ( path :  & Option < PathBuf > )  -> String  { 
64+     match  path { 
65+         None  => String :: from ( "stdin" ) , 
66+         Some ( p)  => p. display ( ) . to_string ( ) , 
67+     } 
68+ } 
69+ 
6870fn  main ( )  -> Result < ( ) ,  Box < dyn  std:: error:: Error > >  { 
6971    // parse command line arguments 
7072    let  args = Args :: parse ( ) ; 
@@ -74,14 +76,9 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
7476
7577    let  mut  exit_code = 0 ; 
7678
77-     let  filename = match  & args. file  { 
78-         None  => String :: new ( ) , 
79-         Some ( name)  => String :: from ( name) , 
80-     } ; 
81- 
82-     if  let  Err ( e)  = tsort_file ( & filename)  { 
79+     if  let  Err ( e)  = tsort_file ( & args. file )  { 
8380        exit_code = 1 ; 
84-         eprintln ! ( "{}: {}" ,  filename ,  e) ; 
81+         eprintln ! ( "{}: {}" ,  pathname_display ( & args . file ) ,  e) ; 
8582    } 
8683
8784    std:: process:: exit ( exit_code) 
0 commit comments