1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- /*
- * Public Domain Software
- *
- * I (Matthias Ladkau) am the author of the source code in this file.
- * I have placed the source code in this file in the public domain.
- *
- * For further information see: http://creativecommons.org/publicdomain/zero/1.0/
- */
- package termutil
- import (
- "bufio"
- "io"
- )
- /*
- filereadingTerminalMixin first provides lines from a given file before delegating
- to a wrapped terminal
- */
- type filereadingTerminalMixin struct {
- ConsoleLineTerminal // Terminal which is being wrapped
- lines []string // File containing the first lines
- linePointer int // Pointer to the next line
- termOnEOF bool // Flag if the terminal should send EOT after last file line
- }
- /*
- AddFileReadingWrapper wraps a given terminal and provides the fist lines of
- a given input reader as first lines before delegating to the wrapped terminal.
- Terminates after the file has been red if termOnEOF is set.
- */
- func AddFileReadingWrapper(term ConsoleLineTerminal, r io.Reader, termOnEOF bool) (ConsoleLineTerminal, error) {
- var ret ConsoleLineTerminal
- fileterm := &filereadingTerminalMixin{term, nil, 0, termOnEOF}
- scanner := bufio.NewScanner(r)
- for scanner.Scan() {
- fileterm.lines = append(fileterm.lines, scanner.Text())
- }
- ret = fileterm
- return ret, nil
- }
- /*
- NextLine returns the next line in the lines array. After the final line it
- either delegates to the wrapped terminal or sends EOT.
- */
- func (ht *filereadingTerminalMixin) NextLine() (string, error) {
- var line string
- var err error
- if ht.linePointer < len(ht.lines) {
- line = ht.lines[ht.linePointer]
- ht.linePointer++
- } else if !ht.termOnEOF {
- line, err = ht.ConsoleLineTerminal.NextLine()
- } else {
- line = "\x04"
- }
- return line, err
- }
|