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 }