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  }