github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/io/rx.go (about) 1 package io 2 3 import ( 4 "path/filepath" 5 "regexp" 6 7 "github.com/lmorg/murex/lang" 8 "github.com/lmorg/murex/lang/types" 9 "github.com/lmorg/murex/utils/json" 10 ) 11 12 func init() { 13 lang.DefineMethod("rx", cmdLsRx, types.ReadArray, types.Json) 14 lang.DefineMethod("!rx", cmdLsRx, types.ReadArray, types.Json) 15 } 16 17 func cmdLsRx(p *lang.Process) (err error) { 18 if p.IsMethod { 19 return cmdLsRxMethod(p) 20 } 21 22 p.Stdout.SetDataType(types.Json) 23 24 rx, err := regexp.Compile(p.Parameters.StringAll()) 25 if err != nil { 26 return 27 } 28 29 files, err := filepath.Glob("*") 30 if err != nil { 31 return 32 } 33 34 var matched []string 35 for i := range files { 36 if rx.MatchString(files[i]) != p.IsNot { 37 matched = append(matched, files[i]) 38 } 39 } 40 41 j, err := json.Marshal(matched, p.Stdout.IsTTY()) 42 if err != nil { 43 return 44 } 45 46 _, err = p.Stdout.Writeln(j) 47 return 48 } 49 50 func cmdLsRxMethod(p *lang.Process) (err error) { 51 dt := types.Json 52 p.Stdout.SetDataType(dt) 53 54 rx, err := regexp.Compile(p.Parameters.StringAll()) 55 if err != nil { 56 return 57 } 58 59 files, err := filepath.Glob("*") 60 if err != nil { 61 return 62 } 63 64 var matched []string 65 for i := range files { 66 if rx.MatchString(files[i]) != !p.IsNot { 67 matched = append(matched, files[i]) 68 } 69 } 70 71 aw, err := p.Stdout.WriteArray(dt) 72 if err != nil { 73 return err 74 } 75 76 err = p.Stdin.ReadArray(p.Context, func(b []byte) { 77 s := string(b) 78 for i := range matched { 79 if matched[i] == s { 80 return 81 } 82 } 83 err = aw.WriteString(s) 84 if err != nil { 85 p.Done() 86 } 87 }) 88 if err != nil { 89 return err 90 } 91 92 return aw.Close() 93 }