go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/cli/shell/completer.go (about)

     1  // Copyright (c) Mondoo, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package shell
     5  
     6  import (
     7  	"github.com/c-bata/go-prompt"
     8  	"go.mondoo.com/cnquery"
     9  	"go.mondoo.com/cnquery/llx"
    10  	"go.mondoo.com/cnquery/mqlc"
    11  )
    12  
    13  var completerSeparator = string([]byte{'.', ' '})
    14  
    15  // Completer is an auto-complete helper for the shell
    16  type Completer struct {
    17  	schema      llx.Schema
    18  	features    cnquery.Features
    19  	queryPrefix func() string
    20  }
    21  
    22  // NewCompleter creates a new Mondoo completer object
    23  func NewCompleter(schema llx.Schema, features cnquery.Features, queryPrefix func() string) *Completer {
    24  	return &Completer{
    25  		schema:      schema,
    26  		features:    features,
    27  		queryPrefix: queryPrefix,
    28  	}
    29  }
    30  
    31  // CompletePrompt provides suggestions
    32  func (c *Completer) CompletePrompt(doc prompt.Document) []prompt.Suggest {
    33  	if doc.TextBeforeCursor() == "" {
    34  		return []prompt.Suggest{}
    35  	}
    36  
    37  	var query string
    38  	if c.queryPrefix != nil {
    39  		query = c.queryPrefix()
    40  	}
    41  	query += doc.TextBeforeCursor()
    42  
    43  	bundle, _ := mqlc.Compile(query, nil, mqlc.NewConfig(c.schema, c.features))
    44  	if bundle == nil || len(bundle.Suggestions) == 0 {
    45  		return []prompt.Suggest{}
    46  	}
    47  
    48  	res := make([]prompt.Suggest, len(bundle.Suggestions))
    49  	for i := range bundle.Suggestions {
    50  		cur := bundle.Suggestions[i]
    51  		res[i] = prompt.Suggest{
    52  			Text:        cur.Field,
    53  			Description: cur.Title,
    54  		}
    55  	}
    56  
    57  	return res
    58  
    59  	// Alternatively we can decide to let prompt filter this list of words for us:
    60  	// return prompt.FilterHasPrefix(suggest, doc.GetWordBeforeCursor(), true)
    61  }