-
Notifications
You must be signed in to change notification settings - Fork 4
/
ext_editor.go
90 lines (75 loc) · 2.16 KB
/
ext_editor.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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package main
import (
"log"
"os/exec"
"github.com/andrianbdn/wg-cmd/backend"
"github.com/andrianbdn/wg-cmd/sysinfo"
tea "github.com/charmbracelet/bubbletea"
)
type editingFinishedMsg struct {
err error
}
type extEditorState struct {
editor string
file string
reopen bool
editServer bool
}
func newExtEditorState(file string, editServer bool) extEditorState {
return extEditorState{editor: sysinfo.GetSystemEditorPath(), file: file, editServer: editServer}
}
func (e *extEditorState) launchEditor() tea.Cmd {
cmd := exec.Command(e.editor, e.file)
log.Println("Launching editor:", cmd.String())
return tea.ExecProcess(cmd, func(err error) tea.Msg {
log.Println("Editor finished with error:", err)
return editingFinishedMsg{err}
})
}
func (m MainScreen) editorEvents(msg tea.Msg) (bool, tea.Model, tea.Cmd) {
switch msg := msg.(type) {
case editingFinishedMsg:
if msg.err != nil {
m.dialog = NewTuiDialogMsg("Error", msg.err.Error(), true)
m.extEditor.reopen = false
return true, m, m.dialog.Init()
}
err := m.app.LoadInterface(m.app.State.Server.Interface)
if err != nil {
m.dialog = NewTuiDialogMsg(
"Error",
err.Error()+". Edit file to fix the problem.",
true)
m.extEditor.reopen = true
return true, m, m.dialog.Init()
}
m.extEditor.reopen = false
if m.extEditor.editServer {
m.table = newAppDynamicTableList(m.app, &m.table)
}
// Even if we edit peer, we may need to regenerate the server config
// because of AddServerRoute client configuration option mainly
m.app.GenerateWireguardConfigLog()
return true, m, nil
}
return false, m, nil
}
func (m MainScreen) EditCurrentItem() (tea.Model, tea.Cmd) {
file := ""
editServer := false
if m.table.GetSelectedIndex() == 0 {
file = backend.ServerFileName
editServer = true
} else {
peer := clientFromRow(m.app, m.table.GetSelected())
file = peer.GetFileName()
}
file = m.app.State.JoinPath(file)
m.extEditor = newExtEditorState(file, editServer)
if m.extEditor.editor == "" {
m.dialog = NewTuiDialogMsg("Error", "Cannot find any editor", true)
return m, nil
}
m.exitBanner = exitBannerShouldShow
return m, m.extEditor.launchEditor()
}