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

     1  package management
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  
     7  	"github.com/lmorg/murex/lang"
     8  	"github.com/lmorg/murex/lang/parameters"
     9  	"github.com/lmorg/murex/lang/types"
    10  	"github.com/lmorg/murex/shell/hintsummary"
    11  	"github.com/lmorg/murex/utils/json"
    12  	"github.com/lmorg/murex/utils/man"
    13  	"github.com/lmorg/murex/utils/parser"
    14  )
    15  
    16  func init() {
    17  	lang.DefineFunction("args", cmdArgs, types.Null)
    18  	lang.DefineMethod("murex-parser", cmdParser, types.String, types.Json)
    19  	lang.DefineFunction("summary", cmdSummary, types.Null)
    20  	lang.DefineFunction("!summary", cmdBangSummary, types.Null)
    21  	lang.DefineMethod("man-get-flags", cmdManParser, types.Text, types.Json)
    22  }
    23  
    24  func cmdArgs(p *lang.Process) (err error) {
    25  	p.Stdout.SetDataType(types.Null)
    26  
    27  	if p.Parameters.Len() != 2 {
    28  		return errors.New("invalid parameters. Usage: args var_name { json }")
    29  	}
    30  
    31  	varName, _ := p.Parameters.String(0)
    32  
    33  	var args parameters.Arguments
    34  	b, _ := p.Parameters.Byte(1)
    35  	err = json.UnmarshalMurex(b, &args)
    36  	if err != nil {
    37  		return err
    38  	}
    39  
    40  	type flags struct {
    41  		Self       string
    42  		Flags      map[string]string
    43  		Additional []string
    44  		Error      string
    45  	}
    46  	var jObj flags
    47  
    48  	params := p.Scope.Parameters.StringArray()
    49  	if p.Scope.Id == 0 && len(params) > 0 {
    50  		jObj.Self = params[0]
    51  		if len(params) == 1 {
    52  			params = []string{}
    53  		} else {
    54  			params = params[1:]
    55  		}
    56  	} else {
    57  		jObj.Self = p.Scope.Name.String()
    58  	}
    59  
    60  	jObj.Flags, jObj.Additional, err = parameters.ParseFlags(params, &args)
    61  	if err != nil {
    62  		jObj.Error = err.Error()
    63  		p.ExitNum = 1
    64  	}
    65  
    66  	b, err = json.Marshal(jObj, false)
    67  	if err != nil {
    68  		return err
    69  	}
    70  
    71  	//return p.Scope.Variables.Set(varName, b, types.Json)
    72  	return p.Variables.Set(p, varName, b, types.Json)
    73  }
    74  
    75  func cmdParser(p *lang.Process) error {
    76  	p.Stdout.SetDataType(types.Json)
    77  
    78  	var (
    79  		block []rune
    80  		pos   int
    81  		//syntaxHighlight bool
    82  	)
    83  
    84  	if p.IsMethod {
    85  		b, err := p.Stdin.ReadAll()
    86  		if err != nil {
    87  			return err
    88  		}
    89  		block = []rune(string(b))
    90  
    91  		//syntaxHighlight, _ = p.Parameters.Bool(0)
    92  
    93  	} else {
    94  		r, err := p.Parameters.Block(0)
    95  		if err != nil {
    96  			return err
    97  		}
    98  		block = r
    99  		pos, _ = p.Parameters.Int(1)
   100  	}
   101  
   102  	pt, _ /*ansiHighlighted*/ := parser.Parse(block, pos)
   103  
   104  	/*if syntaxHighlight {
   105  		_, err := p.Stdout.Write([]byte(ansiHighlighted))
   106  		return err
   107  	}*/
   108  
   109  	b, err := json.Marshal(pt, p.Stdout.IsTTY())
   110  	if err != nil {
   111  		return err
   112  	}
   113  
   114  	//_, err = p.Stdout.Write(b)
   115  
   116  	/*// start new parser
   117  	nodes, _ := lang.ParseBlock(block)
   118  	b, err = json.Marshal(nodes, p.Stdout.IsTTY())
   119  	if err != nil {
   120  		return err
   121  	}
   122  	// end new parser*/
   123  
   124  	_, err = p.Stdout.Write(b)
   125  
   126  	return err
   127  }
   128  
   129  func cmdSummary(p *lang.Process) error {
   130  	p.Stdout.SetDataType(types.Null)
   131  
   132  	exe, err := p.Parameters.String(0)
   133  	if err != nil {
   134  		return err
   135  	}
   136  
   137  	summary, err := p.Parameters.String(1)
   138  	if err != nil {
   139  		return err
   140  	}
   141  
   142  	hintsummary.Summary.Set(exe, summary)
   143  
   144  	return nil
   145  }
   146  
   147  func cmdBangSummary(p *lang.Process) error {
   148  	p.Stdout.SetDataType(types.Null)
   149  
   150  	exe, err := p.Parameters.String(0)
   151  	if err != nil {
   152  		return err
   153  	}
   154  
   155  	return hintsummary.Summary.Delete(exe)
   156  }
   157  
   158  const manArgDescriptions = "--descriptions"
   159  
   160  var manArgs = &parameters.Arguments{
   161  	AllowAdditional: true,
   162  	Flags: map[string]string{
   163  		manArgDescriptions: types.Boolean,
   164  		"-d":               manArgDescriptions,
   165  	},
   166  }
   167  
   168  func cmdManParser(p *lang.Process) error {
   169  	p.Stdout.SetDataType(types.Json)
   170  
   171  	var (
   172  		flags        []string
   173  		descriptions = map[string]string{}
   174  	)
   175  
   176  	cmdFlags, additional, err := p.Parameters.ParseFlags(manArgs)
   177  	if err != nil {
   178  		return err
   179  	}
   180  
   181  	if p.IsMethod {
   182  		flags, descriptions = man.ParseByStdio(p.Stdin)
   183  
   184  	} else {
   185  		if len(additional) != 1 {
   186  			return fmt.Errorf("invalid parameters")
   187  		}
   188  		exe := additional[0]
   189  
   190  		paths := man.GetManPages(exe)
   191  		flags, descriptions = man.ParseByPaths(exe, paths)
   192  	}
   193  
   194  	var b []byte
   195  	if cmdFlags[manArgDescriptions] == types.TrueString {
   196  		b, err = json.Marshal(descriptions, p.Stdout.IsTTY())
   197  	} else {
   198  		b, err = json.Marshal(flags, p.Stdout.IsTTY())
   199  	}
   200  	if err != nil {
   201  		return err
   202  	}
   203  
   204  	_, err = p.Stdout.Write(b)
   205  	return err
   206  }