in lib/file.go [139:168]
func readDir(arg ref.Val) ref.Val {
path, ok := arg.(types.String)
if !ok {
return types.ValOrErr(path, "no such overload for dir: %s", arg.Type())
}
f, err := os.Open(string(path))
if err != nil {
return types.NewErr("dir: %v", err)
}
dir, err := f.ReadDir(0)
if err != nil {
return types.NewErr("dir: %v", err)
}
// Stabilise order across platforms.
sort.Slice(dir, func(i, j int) bool { return dir[i].Name() < dir[j].Name() })
res := make([]map[string]interface{}, len(dir))
for i, e := range dir {
fi, err := e.Info()
if err != nil {
return types.NewErr("dir: %v", err)
}
res[i] = map[string]interface{}{
"name": e.Name(),
"is_dir": e.IsDir(),
"size": fi.Size(),
"mod_time": fi.ModTime(),
}
}
return types.NewDynamicList(types.DefaultTypeAdapter, res)
}