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  }