diff --git a/yaml.go b/yaml.go index f008ef2..18ed68f 100644 --- a/yaml.go +++ b/yaml.go @@ -19,29 +19,16 @@ func main() { Name: "read", Aliases: []string{"r"}, Usage: "read \n\te.g.: yaml read sample.json a.b.c\n\t(default) reads a property from a given yaml file", - Action: read_file, + Action: read_property, }, } - app.Action = read_file + app.Action = read_property app.Run(os.Args) } -func read_file(c *cli.Context) { - if len(c.Args()) == 0 { - log.Fatalf("Must provide filename") - } - var filename = c.Args()[0] - var raw_data, read_error = ioutil.ReadFile(filename) - if read_error != nil { - log.Fatalf("error: %v", read_error) - } - +func read_property(c *cli.Context) { var parsed_data map[interface{}]interface{} - - err := yaml.Unmarshal([]byte(raw_data), &parsed_data) - if err != nil { - log.Fatalf("error: %v", err) - } + read_yaml(c, &parsed_data) var path = c.Args()[1] var paths = strings.Split(path, ".") @@ -49,14 +36,36 @@ func read_file(c *cli.Context) { fmt.Println(read(parsed_data, paths[0], paths[1:len(paths)])) } -func read(context map[interface{}]interface{}, head string, tail []string) interface{} { - value := context[head] - // fmt.Println("read called") +func read_yaml(c *cli.Context, parsed_data *map[interface{}]interface{}) { + if len(c.Args()) == 0 { + log.Fatalf("Must provide filename") + } + var raw_data = read_file(c.Args()[0]) - switch value.(type) { - case bool, int, string, []interface{}: - return value - default: // recurse into map - return read(value.(map[interface{}]interface{}), tail[0], tail[1:len(tail)]) + if len(c.Args()) == 1 { + fmt.Println(string(raw_data[:])) + os.Exit(0) + } + + err := yaml.Unmarshal([]byte(raw_data), &parsed_data) + if err != nil { + log.Fatalf("error: %v", err) + } +} + +func read_file(filename string) []byte { + var raw_data, read_error = ioutil.ReadFile(filename) + if read_error != nil { + log.Fatalf("error: %v", read_error) + } + return raw_data +} + +func read(context map[interface{}]interface{}, head string, tail []string) interface{} { + value := context[head] + if (len(tail) > 0) { + return read(value.(map[interface{}]interface{}), tail[0], tail[1:len(tail)]) + } else { + return value } }