func Do(p PrefixCompleterInterface, line []rune, pos int) (newLine [][]rune, offset int) { line = line[:pos] goNext := false var lineCompleter PrefixCompleterInterface for _, child := range p.GetChildren() { childName := child.GetName() if len(line) >= len(childName) { if runes.HasPrefix(line, childName) { if len(line) == len(childName) { newLine = append(newLine, []rune{' '}) } else { newLine = append(newLine, childName) } offset = len(childName) lineCompleter = child goNext = true } } else { if runes.HasPrefix(childName, line) { newLine = append(newLine, childName[len(line):]) offset = len(line) lineCompleter = child } } } if len(newLine) != 1 { return } tmpLine := make([]rune, 0, len(line)) for i := offset; i < len(line); i++ { if line[i] == ' ' { continue } tmpLine = append(tmpLine, line[i:]...) return lineCompleter.Do(tmpLine, len(tmpLine)) } if goNext { return lineCompleter.Do(nil, 0) } return }
func (p *PrefixCompleter) Do(line []rune, pos int) (newLine [][]rune, offset int) { line = line[:pos] goNext := false var lineCompleter *PrefixCompleter for _, child := range p.Children { if len(line) >= len(child.Name) { if runes.HasPrefix(line, child.Name) { newLine = append(newLine, child.Name) offset = len(child.Name) lineCompleter = child goNext = true } } else { if runes.HasPrefix(child.Name, line) { newLine = append(newLine, child.Name[len(line):]) offset = len(line) lineCompleter = child } } } if len(newLine) != 1 { return } tmpLine := make([]rune, 0, len(line)) for i := offset; i < len(line); i++ { if line[i] == ' ' { continue } tmpLine = append(tmpLine, line[i:]...) return lineCompleter.Do(tmpLine, len(tmpLine)) } if goNext { return lineCompleter.Do(nil, 0) } return }