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

     1  package docs
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/lmorg/murex/lang"
     7  	"github.com/lmorg/murex/lang/types"
     8  	"github.com/lmorg/murex/utils/json"
     9  )
    10  
    11  func init() {
    12  	lang.DefineFunction("murex-docs", cmdMurexDocs, types.String)
    13  }
    14  
    15  var (
    16  	// Definition stores the definitions for builtins.
    17  	Definition DocsFuncT
    18  
    19  	// Summary stores a one line summary of each builtins.
    20  	// This will be auto-populated by docgen
    21  	Summary map[string]string
    22  
    23  	// Synonym is used for builtins that might have more than one internal alias.
    24  	// This will be auto-populated by docgen
    25  	Synonym map[string]string
    26  )
    27  
    28  type DocsFuncT func(string) []byte
    29  
    30  func cmdMurexDocs(p *lang.Process) error {
    31  	cmd, err := p.Parameters.String(0)
    32  	if err != nil {
    33  		return err
    34  	}
    35  
    36  	switch cmd {
    37  	case "--docs":
    38  		p.Stdout.SetDataType(types.Json)
    39  		b, err := json.Marshal(listDocs(), p.Stdout.IsTTY())
    40  		if err != nil {
    41  			return err
    42  		}
    43  		_, err = p.Stdout.Write(b)
    44  		return err
    45  
    46  	case "--digest", "--summary":
    47  		p.Stdout.SetDataType(types.String)
    48  		cmd, err := p.Parameters.String(1)
    49  		if err != nil {
    50  			return err
    51  		}
    52  
    53  		syn := Synonym[cmd]
    54  		if Summary[syn] == "" {
    55  			return fmt.Errorf("no summary found for command `%s`", cmd)
    56  		}
    57  
    58  		_, err = p.Stdout.Write([]byte(Summary[syn]))
    59  		return err
    60  
    61  	default:
    62  		p.Stdout.SetDataType(types.String)
    63  		syn := Synonym[cmd]
    64  		if syn == "" {
    65  			syn = cmd
    66  		}
    67  		b := Definition(syn)
    68  		if len(b) == 0 {
    69  			return fmt.Errorf("no documentation found for `%s`", cmd)
    70  		}
    71  
    72  		_, err = p.Stdout.Writeln(b)
    73  		return err
    74  	}
    75  }
    76  
    77  func listDocs() map[string]string {
    78  	m := make(map[string]string)
    79  	for k, v := range Synonym {
    80  		m[k] = Summary[v]
    81  	}
    82  	return m
    83  }