-
Notifications
You must be signed in to change notification settings - Fork 6
/
pcsliner.go
70 lines (52 loc) · 1.16 KB
/
pcsliner.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// Package pcsliner 命令行 readline 工具包
package pcsliner
import (
"github.com/peterh/liner"
)
// PCSLiner 封装 *liner.State, 提供更简便的操作
type PCSLiner struct {
State *liner.State
History *LineHistory
tmode liner.ModeApplier
lmode liner.ModeApplier
paused bool
}
// NewLiner 返回 *PCSLiner, 默认设置允许 Ctrl+C 结束
func NewLiner() *PCSLiner {
pl := &PCSLiner{}
pl.tmode, _ = liner.TerminalMode()
line := liner.NewLiner()
pl.lmode, _ = liner.TerminalMode()
line.SetMultiLineMode(true)
line.SetCtrlCAborts(true)
pl.State = line
return pl
}
// Pause 暂停服务
func (pl *PCSLiner) Pause() error {
if pl.paused {
panic("PCSLiner already paused")
}
pl.paused = true
pl.DoWriteHistory()
return pl.tmode.ApplyMode()
}
// Resume 恢复服务
func (pl *PCSLiner) Resume() error {
if !pl.paused {
panic("PCSLiner is not paused")
}
pl.paused = false
return pl.lmode.ApplyMode()
}
// Close 关闭服务
func (pl *PCSLiner) Close() (err error) {
err = pl.State.Close()
if err != nil {
return err
}
if pl.History != nil && pl.History.historyFile != nil {
return pl.History.historyFile.Close()
}
return nil
}