feat: started implementing the tx.
This commit is contained in:
parent
f7f3374698
commit
7c8f818b0f
7 changed files with 141 additions and 7 deletions
4
btest.sh
Executable file
4
btest.sh
Executable file
|
@ -0,0 +1,4 @@
|
|||
#!/bin/sh
|
||||
|
||||
go build -o ./exe/ ./cmd/*
|
||||
|
34
cmd/termsize/main.go
Normal file
34
cmd/termsize/main.go
Normal file
|
@ -0,0 +1,34 @@
|
|||
package main
|
||||
|
||||
import "surdeus.su/core/cli/tx"
|
||||
import "fmt"
|
||||
import "log"
|
||||
import "os"
|
||||
|
||||
func main() {
|
||||
term, ok := tx.NewTerminal(os.Stdin)
|
||||
if !ok {
|
||||
// Some not terminal handling.
|
||||
log.Fatal("not terminal")
|
||||
}
|
||||
term.MakeRaw()
|
||||
defer term.Restore()
|
||||
|
||||
w, h, err := term.GetSize()
|
||||
if err != nil {
|
||||
log.Fatalf("term.GetSize(...): %s\n", err)
|
||||
}
|
||||
fmt.Printf("%d\n%d\n", w, h)
|
||||
|
||||
for {
|
||||
key, _, err := term.ReadKey()
|
||||
if err != nil {
|
||||
log.Fatalf("term.ReadLine(...): %s\n", err)
|
||||
}
|
||||
if key == tx.KeyControlC {
|
||||
break
|
||||
}
|
||||
term.Printf("shit: %q\r\n", key)
|
||||
}
|
||||
}
|
||||
|
5
go.mod
5
go.mod
|
@ -1,3 +1,8 @@
|
|||
module surdeus.su/core/cli
|
||||
|
||||
go 1.18
|
||||
|
||||
require (
|
||||
golang.org/x/sys v0.21.0 // indirect
|
||||
golang.org/x/term v0.21.0 // indirect
|
||||
)
|
||||
|
|
4
go.sum
Normal file
4
go.sum
Normal file
|
@ -0,0 +1,4 @@
|
|||
golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
|
||||
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA=
|
||||
golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0=
|
|
@ -1,7 +0,0 @@
|
|||
version: '3'
|
||||
|
||||
tasks:
|
||||
btest:
|
||||
cmds:
|
||||
- go build ./cmd/test
|
||||
|
8
tx/aes.go
Normal file
8
tx/aes.go
Normal file
|
@ -0,0 +1,8 @@
|
|||
package tx
|
||||
|
||||
type Key rune
|
||||
|
||||
const (
|
||||
KeyControlC Key = '\x03'
|
||||
)
|
||||
|
86
tx/term.go
Normal file
86
tx/term.go
Normal file
|
@ -0,0 +1,86 @@
|
|||
package tx
|
||||
|
||||
import "golang.org/x/term"
|
||||
import "bufio"
|
||||
import "fmt"
|
||||
import "os"
|
||||
|
||||
type Terminal struct {
|
||||
x *term.Terminal
|
||||
file *os.File
|
||||
input *bufio.Reader
|
||||
fd int
|
||||
prevState *term.State
|
||||
}
|
||||
|
||||
func NewTerminal(input *os.File) (*Terminal, bool) {
|
||||
if input == nil {
|
||||
return nil, false
|
||||
}
|
||||
|
||||
fd := int(input.Fd())
|
||||
if !term.IsTerminal(fd) {
|
||||
return nil, false
|
||||
}
|
||||
|
||||
|
||||
ret := Terminal{}
|
||||
ret.file = input
|
||||
ret.input = bufio.NewReader(input)
|
||||
ret.fd = fd
|
||||
ret.x = term.NewTerminal(input, "")
|
||||
|
||||
return &ret, true
|
||||
}
|
||||
|
||||
func (t *Terminal) MakeRaw() error {
|
||||
state, err := term.MakeRaw(t.fd)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
t.prevState = state
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *Terminal) Restore() error {
|
||||
if t.prevState == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
err := term.Restore(t.fd, t.prevState)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *Terminal) GetSize() (int, int, error) {
|
||||
return term.GetSize(t.fd)
|
||||
}
|
||||
|
||||
func (t *Terminal) ReadLine() (string, error) {
|
||||
return t.x.ReadLine()
|
||||
}
|
||||
|
||||
func (t *Terminal) ReadKey() (Key, int, error) {
|
||||
r, size, err := t.input.ReadRune()
|
||||
return Key(r), size, err
|
||||
}
|
||||
|
||||
func (t *Terminal) Write(bts []byte) (int, error) {
|
||||
return t.x.Write(bts)
|
||||
}
|
||||
|
||||
func (t *Terminal) Printf(
|
||||
format string, v ...any,
|
||||
) (int, error) {
|
||||
str := fmt.Sprintf(format, v...)
|
||||
return t.Write([]byte(str))
|
||||
}
|
||||
|
||||
func (t *Terminal) Print(v ...any) (int, error) {
|
||||
str := fmt.Sprint(v...)
|
||||
return t.Write([]byte(str))
|
||||
}
|
Loading…
Reference in a new issue