github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/utils/readline/suggestions.go (about)

     1  package readline
     2  
     3  import "github.com/mattn/go-runewidth"
     4  
     5  type suggestionsT struct {
     6  	rl          *Instance
     7  	suggestions []string
     8  	prefixWidth int
     9  }
    10  
    11  func newSuggestionsT(rl *Instance, suggestions []string) *suggestionsT {
    12  	return &suggestionsT{
    13  		rl:          rl,
    14  		suggestions: suggestions,
    15  		prefixWidth: runewidth.StringWidth(rl.tcPrefix),
    16  	}
    17  }
    18  
    19  func (s *suggestionsT) Len() int {
    20  	return len(s.suggestions)
    21  }
    22  
    23  func (s *suggestionsT) ItemLen(index int) int {
    24  	// fast
    25  	switch {
    26  	case len(s.suggestions[index]) == 0:
    27  		return s.prefixWidth
    28  
    29  	case s.suggestions[index][0] == 2:
    30  		if len(s.suggestions[index]) == 1 {
    31  			return 0
    32  		}
    33  		return len(s.suggestions[index][1:])
    34  	default:
    35  		return len(s.suggestions[index]) + s.prefixWidth
    36  	}
    37  
    38  	// accurate
    39  	/*switch {
    40  	case len(s.suggestions[index]) == 0:
    41  		return runewidth.StringWidth(s.rl.tcPrefix)
    42  
    43  	case s.suggestions[index][0] == 2:
    44  		if len(s.suggestions[index]) == 1 {
    45  			return 0
    46  		}
    47  		return runewidth.StringWidth(s.suggestions[index][1:])
    48  	default:
    49  		return runewidth.StringWidth(s.suggestions[index]) + s.prefixWidth
    50  	}*/
    51  }
    52  
    53  func (s *suggestionsT) ItemValue(index int) string {
    54  	switch {
    55  	case len(s.suggestions[index]) == 0:
    56  		return s.rl.tcPrefix
    57  
    58  	case s.suggestions[index][0] == 2:
    59  		if len(s.suggestions[index]) == 1 {
    60  			return ""
    61  		}
    62  		return s.suggestions[index][1:]
    63  	default:
    64  		return s.rl.tcPrefix + s.suggestions[index]
    65  	}
    66  }
    67  
    68  func (s *suggestionsT) ItemLookupValue(index int) string {
    69  	return s.suggestions[index]
    70  	/*switch {
    71  	case len(s.suggestions[index]) == 0:
    72  		return ""
    73  
    74  	case s.suggestions[index][0] == 2:
    75  		if len(s.suggestions[index]) == 1 {
    76  			return ""
    77  		}
    78  		return s.suggestions[index][1:]
    79  	default:
    80  		return s.suggestions[index]
    81  	}*/
    82  }
    83  
    84  func (s *suggestionsT) ItemCompletionReturn(index int) (string, string) {
    85  	switch {
    86  	case len(s.suggestions[index]) == 0:
    87  		return s.rl.tcPrefix, ""
    88  
    89  	case s.suggestions[index][0] == 2:
    90  		if len(s.suggestions[index]) == 1 {
    91  			return s.rl.tcPrefix, ""
    92  		}
    93  		return "", s.suggestions[index][1:]
    94  	default:
    95  		return s.rl.tcPrefix, s.suggestions[index]
    96  	}
    97  }