Skip to content

Commit

Permalink
Improve argument parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
gopherclass committed Sep 9, 2020
1 parent 464247e commit a9a6db5
Showing 1 changed file with 43 additions and 46 deletions.
89 changes: 43 additions & 46 deletions crumbs/main.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package main

import (
"bufio"
"bytes"
"errors"
"flag"
"fmt"
"io"
Expand All @@ -16,8 +15,8 @@ import (
)

const (
maxFileSize = 512 * 1000 // 512 Kb
banner = `
maxFileSize int64 = 512 * 1000 // 512 Kb
banner = `
__ ____ __ __ ___ ___ ____ _____
/ ]| \| | || | || \ / ___/ v{{VERSION}}
/ / | D ) | || _ _ || o )( \_
Expand All @@ -40,25 +39,12 @@ var (
func main() {
configureFlags()

var entry *crumbs.Entry
var err error
if entry, err = readFromStdIn(); err != nil {
entry, err := readEntry()
if err != nil {
fmt.Fprintf(os.Stderr, "error: %s\n", err.Error())
os.Exit(1)
}

if entry == nil {
if entry, err = readFromFile(); err != nil {
fmt.Fprintf(os.Stderr, "error: %s\n", err.Error())
os.Exit(1)
}
}

if entry == nil {
flag.CommandLine.Usage()
os.Exit(2)
}

cfg := gv.RenderConfig{
WrapTextLimit: flagWrapLim,
VerticalLayout: flagVertical,
Expand All @@ -69,47 +55,58 @@ func main() {
}
}

func readFromStdIn() (*crumbs.Entry, error) {
info, err := os.Stdin.Stat()
func readInput() ([]byte, error) {
limit := maxFileSize
args := flag.Args()
if len(args) == 0 {
return readFileObject(os.Stdin, limit)
}
return readFile(args[0], limit)
}

func readEntry() (*crumbs.Entry, error) {
src, err := readInput()
if err != nil {
return nil, err
}
text := string(src)
lines := strings.SplitAfter(text, "\n")
return crumbs.ParseLines(lines, flagImagesPath)
}

if (info.Mode() & os.ModeCharDevice) != os.ModeCharDevice {
reader := io.LimitReader(bufio.NewReader(os.Stdin), maxFileSize)

dat, err := ioutil.ReadAll(reader)
if err != nil {
return nil, err
}

text := bytes.NewBuffer(dat).String()
lines := strings.SplitAfter(text, "\n")
return crumbs.ParseLines(lines, flagImagesPath)
func tryFileStat(r io.Reader) (os.FileInfo, error) {
object, ok := r.(interface {
io.Reader
Stat() (os.FileInfo, error)
})
if ok {
return object.Stat()
}

return nil, nil
}

func readFromFile() (*crumbs.Entry, error) {
if len(flag.Args()) == 0 {
return nil, nil
}
var errCharDevice = errors.New("operation performed on character device")

reader, err := os.Open(flag.Args()[0])
if err != nil {
return nil, err
func readFileObject(r io.Reader, limit int64) ([]byte, error) {
i, _ := tryFileStat(r)
if i != nil {
if i.Mode()&os.ModeCharDevice > 0 {
return nil, errCharDevice
}
}
defer reader.Close()
lr := io.LimitReader(r, limit)
src, err := ioutil.ReadAll(lr)
return src, err
}

dat, err := ioutil.ReadAll(io.LimitReader(reader, maxFileSize))
func readFile(name string, limit int64) ([]byte, error) {
r, err := os.Open(name)
if err != nil {
return nil, err
}

text := bytes.NewBuffer(dat).String()
lines := strings.SplitAfter(text, "\n")
return crumbs.ParseLines(lines, flagImagesPath)
src, err := readFileObject(r, limit)
r.Close()
return src, err
}

func configureFlags() {
Expand Down

0 comments on commit a9a6db5

Please sign in to comment.