From 83c52e3e7023b69cdd5d89d50aa97859149edc6a Mon Sep 17 00:00:00 2001 From: bth Date: Wed, 21 Jan 2026 12:43:12 -0800 Subject: [PATCH] cat : first naive version --- cat/cat.go | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ cmd/cmd.go | 1 + um.go | 3 +++ 3 files changed, 62 insertions(+) create mode 100644 cat/cat.go diff --git a/cat/cat.go b/cat/cat.go new file mode 100644 index 0000000..04c4e5f --- /dev/null +++ b/cat/cat.go @@ -0,0 +1,58 @@ +package cat + +import ( + "fmt" + "log" + "os" + "strings" + + "github.com/brtholomy/um/go/cmd" + "github.com/brtholomy/um/go/flags" + "github.com/brtholomy/um/go/pipe" +) + +const ( + CMD = cmd.Cat + SUMMARY = "cat um files together using a filelist" + SEPARATOR = "\n---\n\n" +) + +type options struct { + Filelist flags.Arg + Help flags.Flag[bool] +} + +func initOpts() options { + return options{ + flags.Arg{"", "filelist. accepts from stdin if not provided"}, + flags.Flag[bool]{"--help", "-h", false, "show help"}, + } +} + +func cat(files []string) (string, error) { + // strings.Builder ? + // can we estimate needed size? do an ls -S call? + ff := []string{} + for _, f := range files { + dat, err := os.ReadFile(f) + if err != nil { + return "", fmt.Errorf("error opening file: %w", err) + } + ff = append(ff, string(dat)) + } + return strings.Join(ff, SEPARATOR), nil +} + +func Cat(args []string) { + opts := initOpts() + flags.ParseArgs(CMD, SUMMARY, args, &opts) + files, err := pipe.FileListSplitMaybeStdin(opts.Filelist.Val) + if err != nil { + log.Fatalf("um %s: %s", CMD, err) + } + s, err := cat(files) + if err != nil { + log.Fatalf("um %s: %s", CMD, err) + } + fmt.Println(s) +} diff --git a/cmd/cmd.go b/cmd/cmd.go index f38ae64..5f2345d 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -7,5 +7,6 @@ const ( Next Subcommand = "next" Last Subcommand = "last" Sort Subcommand = "sort" + Cat Subcommand = "cat" Help Subcommand = "help" ) diff --git a/um.go b/um.go index 6f57d20..97d9782 100644 --- a/um.go +++ b/um.go @@ -5,6 +5,7 @@ import ( "log" "os" + "github.com/brtholomy/um/go/cat" "github.com/brtholomy/um/go/cmd" "github.com/brtholomy/um/go/last" "github.com/brtholomy/um/go/next" @@ -44,6 +45,8 @@ func main() { tag.Tag(args) case cmd.Sort: sort.Sort(args) + case cmd.Cat: + cat.Cat(args) case cmd.Help: log.Fatalln(helpLong) default: