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

     1  package management
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/lmorg/murex/debug"
     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("debug", cmdDebug, types.Any, types.Json)
    14  }
    15  
    16  func cmdDebug(p *lang.Process) error {
    17  	if p.IsMethod {
    18  		return cmdDebugMethod(p)
    19  	}
    20  
    21  	block, err := p.Parameters.Block(0)
    22  	if err == nil {
    23  		return cmdDebugBlock(p, block)
    24  	}
    25  
    26  	p.Stdout.SetDataType(types.Boolean)
    27  
    28  	v, err := p.Parameters.Bool(0)
    29  
    30  	if err != nil {
    31  		_, err = p.Stdout.Write([]byte(fmt.Sprint(debug.Enabled)))
    32  		return err
    33  	}
    34  	debug.Enabled = v
    35  	if !v {
    36  		p.Stdout.Writeln(types.FalseByte)
    37  		p.ExitNum = 1
    38  		return nil
    39  	}
    40  
    41  	_, err = p.Stdout.Writeln(types.TrueByte)
    42  	return err
    43  }
    44  
    45  func cmdDebugMethod(p *lang.Process) error {
    46  	dt := p.Stdin.GetDataType()
    47  	p.Stdout.SetDataType(types.Json)
    48  
    49  	var (
    50  		j = make(map[string]interface{})
    51  		b []byte
    52  	)
    53  
    54  	obj, err := lang.UnmarshalData(p, dt)
    55  
    56  	j["Process"] = p.Previous.Dump()
    57  	j["Data-Type"] = map[string]string{
    58  		"Murex":             dt,
    59  		"Go":                fmt.Sprintf("%T", obj),
    60  		"UnmarshalData Err": fmt.Sprint(err),
    61  	}
    62  
    63  	b, err = json.Marshal(j, p.Stdout.IsTTY())
    64  	if err != nil {
    65  		return err
    66  	}
    67  
    68  	_, err = p.Stdout.Writeln(b)
    69  	return err
    70  }
    71  
    72  func cmdDebugBlock(p *lang.Process, block []rune) (err error) {
    73  	v := debug.Enabled
    74  	debug.Enabled = true
    75  	defer func() {
    76  		debug.Enabled = v
    77  	}()
    78  
    79  	fork := p.Fork(lang.F_NO_STDIN)
    80  	p.ExitNum, err = fork.Execute(block)
    81  	return
    82  }