lf/client.go

113 lines
2.0 KiB
Go
Raw Normal View History

2016-08-13 12:49:04 +00:00
package main
import (
"bufio"
"fmt"
"io"
2016-08-13 12:49:04 +00:00
"log"
"net"
"os"
2016-10-29 23:20:35 +00:00
"strings"
"time"
2016-08-13 12:49:04 +00:00
"github.com/gdamore/tcell/v2"
2016-08-13 12:49:04 +00:00
)
2017-11-19 18:55:13 +00:00
func run() {
var screen tcell.Screen
var err error
if screen, err = tcell.NewScreen(); err != nil {
log.Fatalf("creating screen: %s", err)
} else if err = screen.Init(); err != nil {
log.Fatalf("initializing screen: %s", err)
}
if gOpts.mouse {
screen.EnableMouse()
}
2018-05-20 17:30:41 +00:00
f, err := os.Create(gLogPath)
2016-08-13 12:49:04 +00:00
if err != nil {
panic(err)
}
defer os.Remove(gLogPath)
2018-05-20 17:30:41 +00:00
defer f.Close()
log.SetOutput(f)
2016-08-13 12:49:04 +00:00
log.Print("hi!")
2021-02-21 14:48:23 +00:00
ui := newUI(screen)
nav := newNav(ui.wins[0].h)
app := newApp(ui, nav)
2016-08-13 12:49:04 +00:00
if err := app.nav.readMarks(); err != nil {
app.ui.echoerrf("reading marks file: %s", err)
}
if err := app.readHistory(); err != nil {
app.ui.echoerrf("reading history file: %s", err)
}
2017-11-19 18:55:13 +00:00
app.loop()
2021-02-21 14:48:23 +00:00
app.ui.screen.Fini()
2016-08-13 12:49:04 +00:00
}
2017-11-19 18:55:13 +00:00
func readExpr() <-chan expr {
2016-12-17 21:47:37 +00:00
ch := make(chan expr)
2016-10-29 23:20:35 +00:00
go func() {
duration := 1 * time.Second
2017-11-19 18:55:13 +00:00
c, err := net.Dial(gSocketProt, gSocketPath)
for err != nil {
log.Printf("connecting server: %s", err)
time.Sleep(duration)
duration *= 2
2018-07-26 19:11:05 +00:00
c, err = net.Dial(gSocketProt, gSocketPath)
2017-11-19 18:55:13 +00:00
}
2016-12-17 21:47:37 +00:00
fmt.Fprintf(c, "conn %d\n", gClientID)
2016-10-29 23:20:35 +00:00
ch <- &callExpr{"sync", nil, 1}
2017-11-19 18:55:13 +00:00
2016-10-29 23:20:35 +00:00
s := bufio.NewScanner(c)
for s.Scan() {
log.Printf("recv: %s", s.Text())
2016-10-29 23:20:35 +00:00
p := newParser(strings.NewReader(s.Text()))
if p.parse() {
ch <- p.expr
}
}
c.Close()
}()
return ch
}
2019-02-26 18:27:04 +00:00
func remote(cmd string) error {
c, err := net.Dial(gSocketProt, gSocketPath)
if err != nil {
return fmt.Errorf("dialing to send server: %s", err)
}
fmt.Fprintln(c, cmd)
// XXX: Standard net.Conn interface does not include a CloseWrite method
// but net.UnixConn and net.TCPConn implement it so the following should be
// safe as long as we do not use other types of connections. We need
// CloseWrite to notify the server that this is not a persistent connection
// and it should be closed after the response.
if v, ok := c.(interface {
CloseWrite() error
}); ok {
v.CloseWrite()
}
io.Copy(os.Stdout, c)
c.Close()
return nil
}