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  }