um/pipe/pipe.go
2026-01-21 14:04:46 -08:00

58 lines
1.3 KiB
Go

package pipe
import (
"errors"
"fmt"
"io"
"log"
"os"
"strings"
)
const Newline string = "\n"
func isStdinLoaded() bool {
stat, _ := os.Stdin.Stat()
return (stat.Mode() & os.ModeCharDevice) == 0
}
func GetStdin() ([]string, error) {
if !isStdinLoaded() {
return nil, errors.New("stdin not loaded")
}
dat, err := io.ReadAll(os.Stdin)
if err != nil {
log.Fatal(err)
}
// TODO: there's got to be a better way:
s := strings.TrimSuffix(string(dat), Newline)
return strings.Split(s, Newline), nil
}
// reads files from stdin if present, otherwise from the filename:
func FileListSplitMaybeStdin(f string) ([]string, error) {
filelist, err := GetStdin()
if err != nil {
// BORK: don't see a neater way of wrapping these two when we depend on the non-nil in this block:
// if i just return FileListSplit(), we lose the first err
filelist, err2 := FileListSplit(f)
if err2 != nil {
return nil, fmt.Errorf("%w: %w", err, err2)
}
return filelist, nil
}
return filelist, nil
}
// opens the given filename and splits into lines:
func FileListSplit(f string) ([]string, error) {
if f == "" {
return nil, errors.New("filename is empty")
}
dat, err := os.ReadFile(f)
if err != nil {
return nil, fmt.Errorf("error opening file: %w", err)
}
s := strings.TrimSuffix(string(dat), Newline)
return strings.Split(s, Newline), nil
}