55 lines
739 B
Go
55 lines
739 B
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package execclient
|
|
|
|
import (
|
|
"io"
|
|
)
|
|
|
|
type EscapeWatcher struct {
|
|
Cancel func()
|
|
Input io.Reader
|
|
|
|
state int
|
|
}
|
|
|
|
const (
|
|
escNormal = iota
|
|
escNewline
|
|
escTilde
|
|
)
|
|
|
|
func (ew *EscapeWatcher) Read(b []byte) (int, error) {
|
|
n, err := ew.Input.Read(b)
|
|
if err != nil {
|
|
return n, err
|
|
}
|
|
|
|
for _, r := range b[:n] {
|
|
switch ew.state {
|
|
case escNewline:
|
|
switch r {
|
|
case '~':
|
|
ew.state = escTilde
|
|
case '\n':
|
|
ew.state = escNewline
|
|
default:
|
|
ew.state = escNormal
|
|
}
|
|
case escTilde:
|
|
if r == '.' {
|
|
ew.Cancel()
|
|
} else {
|
|
ew.state = escNormal
|
|
}
|
|
case escNormal:
|
|
if r == '\n' {
|
|
ew.state = escNewline
|
|
}
|
|
}
|
|
}
|
|
|
|
return n, nil
|
|
}
|