github.com/scottcagno/storage@v1.8.0/pkg/filesystem/cat.go (about) 1 package filesystem 2 3 import ( 4 "bufio" 5 "flag" 6 "fmt" 7 "io" 8 "log" 9 "os" 10 "strings" 11 ) 12 13 var showLines = flag.Bool("n", false, "flag to output the line numbers") 14 15 func CatCLI() { 16 // parse flags 17 flag.Parse() 18 // if no file was given, copy stdin to stdout 19 if flag.NArg() == 0 { 20 cat(os.Stdout, os.Stdin) 21 return 22 } 23 // otherwise, a file was given, so open and use as input 24 fd, err := os.Open(flag.Arg(0)) 25 if err != nil { 26 log.Fatal(err) 27 } 28 // defer close 29 defer func(fd *os.File) { 30 err := fd.Close() 31 if err != nil { 32 log.Panic(err) 33 } 34 }(fd) 35 cat(os.Stdout, fd) 36 } 37 38 func Cat(w io.Writer, r io.Reader) { 39 show, ok := os.LookupEnv("SHOW_LINES") 40 if ok { 41 show = strings.ToLower(show) 42 if show == "1" || show == "t" || show == "true" { 43 *showLines = true 44 } 45 } 46 cat(w, r) 47 } 48 49 func cat(w io.Writer, r io.Reader) { 50 if !*showLines { 51 _, err := io.Copy(w, r) 52 if err != nil { 53 fmt.Fprintf(os.Stderr, "%s", err) 54 } 55 return 56 } 57 sc, ln := bufio.NewScanner(r), 1 58 for sc.Scan() { 59 fmt.Fprintf(w, "\r%6d %s\n", ln, sc.Bytes()) 60 ln++ 61 } 62 if err := sc.Err(); err != nil { 63 fmt.Fprintf(os.Stderr, "%s", err) 64 } 65 }