github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/autocomplete/autocomplete.go (about)

     1  package cmdautocomplete
     2  
     3  import (
     4  	"errors"
     5  	"sort"
     6  
     7  	"github.com/lmorg/murex/lang"
     8  	"github.com/lmorg/murex/lang/types"
     9  	"github.com/lmorg/murex/shell/autocomplete"
    10  	"github.com/lmorg/murex/utils/json"
    11  )
    12  
    13  func init() {
    14  	lang.DefineFunction("autocomplete", cmdAutocomplete, types.Json)
    15  }
    16  
    17  func cmdAutocomplete(p *lang.Process) error {
    18  	mode, err := p.Parameters.String(0)
    19  	if err != nil {
    20  		p.Stdout.SetDataType(types.Null)
    21  		return err
    22  	}
    23  
    24  	switch mode {
    25  	case "get":
    26  		return get(p)
    27  
    28  	case "set":
    29  		return set(p)
    30  
    31  	//case "cache-dynamic":
    32  	//	return cacheDynamic(p)
    33  
    34  	default:
    35  		p.Stdout.SetDataType(types.Null)
    36  		return errors.New("Not a valid mode. Please use `get` or `set`")
    37  	}
    38  }
    39  
    40  func get(p *lang.Process) error {
    41  	p.Stdout.SetDataType(types.Json)
    42  
    43  	var v interface{}
    44  	cmd, err := p.Parameters.String(1)
    45  	if err != nil {
    46  		v = autocomplete.ExesFlags
    47  	} else {
    48  		v = autocomplete.ExesFlags[cmd]
    49  	}
    50  
    51  	b, err := json.Marshal(v, p.Stdout.IsTTY())
    52  	if err != nil {
    53  		return err
    54  	}
    55  
    56  	_, err = p.Stdout.Writeln(b)
    57  	return err
    58  }
    59  
    60  func set(p *lang.Process) error {
    61  	p.Stdout.SetDataType(types.Null)
    62  
    63  	exe, err := p.Parameters.String(1)
    64  	if err != nil {
    65  		return err
    66  	}
    67  
    68  	var jf []byte
    69  
    70  	if p.IsMethod {
    71  
    72  		jf, err = p.Stdin.ReadAll()
    73  		if err != nil {
    74  			return err
    75  		}
    76  
    77  	} else {
    78  
    79  		jfr, err := p.Parameters.Block(2)
    80  		if err == nil {
    81  			jf = []byte(string(jfr))
    82  		} else {
    83  			jf, err = p.Parameters.Byte(2)
    84  			if err != nil {
    85  				return err
    86  			}
    87  		}
    88  	}
    89  
    90  	var flags []autocomplete.Flags
    91  	err = json.UnmarshalMurex(jf, &flags)
    92  	if err != nil {
    93  		return err
    94  	}
    95  
    96  	// So we don't have nil values in JSON
    97  	if flags[0].CacheTTL == 0 {
    98  		flags[0].CacheTTL = 5
    99  	}
   100  	for i := range flags {
   101  		if len(flags[i].Flags) == 0 {
   102  			flags[i].Flags = make([]string, 0)
   103  		}
   104  
   105  		sort.Strings(flags[i].Flags)
   106  	}
   107  
   108  	autocomplete.ExesFlags[exe] = flags
   109  	autocomplete.ExesFlagsFileRef[exe] = p.FileRef
   110  	return nil
   111  }