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  }