github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/io/g.go (about) 1 package io 2 3 import ( 4 "path/filepath" 5 6 "github.com/lmorg/murex/lang" 7 "github.com/lmorg/murex/lang/types" 8 "github.com/lmorg/murex/utils/json" 9 "github.com/lmorg/murex/utils/lists" 10 ) 11 12 func init() { 13 lang.DefineMethod("g", cmdLsG, types.ReadArray, types.Json) 14 lang.DefineMethod("!g", cmdLsNotG, types.ReadArray, types.Json) 15 } 16 17 func cmdLsG(p *lang.Process) (err error) { 18 if p.IsMethod { 19 return cmdLsGMethod(p) 20 } 21 22 p.Stdout.SetDataType(types.Json) 23 24 glob := p.Parameters.StringAll() 25 files, err := filepath.Glob(glob) 26 if err != nil { 27 return 28 } 29 30 j, err := json.Marshal(files, p.Stdout.IsTTY()) 31 if err != nil { 32 return 33 } 34 35 _, err = p.Stdout.Writeln(j) 36 return 37 } 38 39 func cmdLsGMethod(p *lang.Process) (err error) { 40 dt := types.Json 41 p.Stdout.SetDataType(dt) 42 43 glob := p.Parameters.StringAll() 44 all, err := filepath.Glob(glob) 45 if err != nil { 46 return 47 } 48 49 aw, err := p.Stdout.WriteArray(dt) 50 if err != nil { 51 return err 52 } 53 54 err = p.Stdin.ReadArray(p.Context, func(b []byte) { 55 s := string(b) 56 for i := range all { 57 if all[i] == s { 58 err = aw.WriteString(s) 59 if err != nil { 60 p.Done() 61 } 62 } 63 } 64 }) 65 if err != nil { 66 return err 67 } 68 69 return aw.Close() 70 } 71 72 func cmdLsNotG(p *lang.Process) (err error) { 73 if p.IsMethod { 74 return cmdLsNotGMethod(p) 75 } 76 77 p.Stdout.SetDataType(types.Json) 78 79 glob, err := filepath.Glob(p.Parameters.StringAll()) 80 if err != nil { 81 return 82 } 83 84 all, err := filepath.Glob("*") 85 if err != nil { 86 return 87 } 88 89 var files []string 90 for i := range all { 91 if !lists.Match(glob, all[i]) { 92 files = append(files, all[i]) 93 } 94 } 95 96 j, err := json.Marshal(files, p.Stdout.IsTTY()) 97 if err != nil { 98 return 99 } 100 101 _, err = p.Stdout.Writeln(j) 102 return 103 } 104 105 func cmdLsNotGMethod(p *lang.Process) (err error) { 106 dt := types.Json 107 p.Stdout.SetDataType(dt) 108 109 glob := p.Parameters.StringAll() 110 all, err := filepath.Glob(glob) 111 if err != nil { 112 return 113 } 114 115 aw, err := p.Stdout.WriteArray(dt) 116 if err != nil { 117 return err 118 } 119 120 err = p.Stdin.ReadArray(p.Context, func(b []byte) { 121 s := string(b) 122 for i := range all { 123 if all[i] == s { 124 return 125 } 126 } 127 err = aw.WriteString(s) 128 if err != nil { 129 p.Done() 130 } 131 }) 132 if err != nil { 133 return err 134 } 135 136 return aw.Close() 137 }