github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/io/f.go (about) 1 package io 2 3 import ( 4 "errors" 5 "os" 6 "path/filepath" 7 8 "github.com/lmorg/murex/lang" 9 "github.com/lmorg/murex/lang/types" 10 "github.com/lmorg/murex/utils/json" 11 ) 12 13 func init() { 14 lang.DefineMethod("f", cmdLsF, types.ReadArray, types.Json) 15 //lang.DefineMethod("!f", cmdLsF, types.ReadArray, types.Json) 16 } 17 18 func cmdLsF(p *lang.Process) (err error) { 19 p.Stdout.SetDataType(types.Json) 20 var ( 21 add, remove fFlagsT 22 ) 23 24 params := p.Parameters.RuneArray() 25 if len(params) == 0 { 26 return errors.New("missing parameters") 27 } 28 29 for _, r := range params { 30 add, remove, err = fFlagsParser(r, add, remove) 31 if err != nil { 32 return err 33 } 34 } 35 36 if remove&fHelp != 0 { 37 return cmdLsFHelp(p) 38 } 39 40 var files, matched []string 41 42 if p.IsMethod { 43 p.Stdin.ReadArray(p.Context, func(b []byte) { 44 files = append(files, string(b)) 45 }) 46 47 } else { 48 files, err = filepath.Glob("*") 49 if err != nil { 50 return 51 } 52 } 53 54 for i := range files { 55 if p.HasCancelled() { 56 break 57 } 58 59 info, err := os.Lstat(files[i]) 60 if err != nil { 61 continue 62 } 63 64 if matchFlags(add, remove, info) { 65 matched = append(matched, files[i]) 66 } 67 } 68 69 var b []byte 70 b, err = json.Marshal(matched, p.Stdout.IsTTY()) 71 if err == nil { 72 _, err = p.Stdout.Writeln(b) 73 } 74 75 return 76 } 77 78 func cmdLsFHelp(p *lang.Process) error { 79 v := make(map[string]string) 80 for r, f := range fFlagLookup { 81 v[string([]rune{r})] = cmdLsFHelpLookup(r, f) 82 } 83 84 b, err := json.Marshal(v, p.Stdout.IsTTY()) 85 if err != nil { 86 return err 87 } 88 _, err = p.Stdout.Write(b) 89 return err 90 } 91 92 func cmdLsFHelpLookup(r rune, f fFlagsT) string { 93 switch r { 94 95 case 'f': 96 return "any file type (inc symlinks)" 97 case 'd': 98 return "directory (inc symlinks)" 99 case 'r': 100 return "user, group and other read" 101 case 'w': 102 return "user, group and other write" 103 case 'x': 104 return "user, group and other execute" 105 case '?': 106 return "deprecated -- use `i` instead" 107 default: 108 return f.String() 109 } 110 }