diff --git a/cat.go b/cat.go new file mode 100644 index 0000000..6e5b0f7 --- /dev/null +++ b/cat.go @@ -0,0 +1,6 @@ +package jsh + +type CatOutput struct { + Output string + Files []string +} diff --git a/cat/main.go b/cat/main.go new file mode 100644 index 0000000..cfcd629 --- /dev/null +++ b/cat/main.go @@ -0,0 +1,55 @@ +package main + +import ( + "flag" + "fmt" + "io/ioutil" + "jsh" +) + +func catFiles(queue chan *jsh.JshFrame) { + // Get all of the non-flags. The rest were processed by the main function + fileNames := flag.Args() + for _, fileName := range fileNames { + file, err := ioutil.ReadFile(fileName) + + var jshFrame jsh.JshFrame + + // If there's an error, output an error frame to the queue and continue + if err != nil { + errText := make(map[string]string) + errText[fileName] = fmt.Sprintf("%s", err.Error()) + jshFrame = jsh.JshFrame{"", errText} + queue <- &jshFrame + continue + } + + // Put the file contents into a frame and send them to the output + output := jsh.CatOutput{} + output.Files = []string{fileName} + output.Output = string(file) + jshFrame = jsh.JshFrame{output, ""} + queue <- &jshFrame + } +} + +func runJsonMode() { + queue := make(chan *jsh.JshFrame) + done := make(chan bool) + go jsh.OutputFrames(queue, done) + catFiles(queue) + close(queue) + <-done +} + +func main() { + // TODO: Support more flags + jsonModePtr := flag.Bool("json", false, "whether to use json mode for input and output") + flag.Parse() + + if !*jsonModePtr { + fmt.Printf("%s", jsh.FallbackWithArgs("cat", flag.Args())) + } else { + runJsonMode() + } +}