main.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package main
  2. import (
  3. "mimicry/config"
  4. "mimicry/ui"
  5. "os"
  6. "strings"
  7. "time"
  8. "golang.org/x/term"
  9. )
  10. // TODO: clean up most panics
  11. func main() {
  12. if len(os.Args) < 3 {
  13. help()
  14. return
  15. }
  16. config, err := config.Parse()
  17. if err != nil {
  18. os.Stderr.WriteString(err.Error() + "\n")
  19. return
  20. }
  21. oldTerminal, err := term.MakeRaw(int(os.Stdin.Fd()))
  22. if err != nil {
  23. panic(err)
  24. }
  25. defer term.Restore(int(os.Stdin.Fd()), oldTerminal)
  26. width, height, err := term.GetSize(int(os.Stdin.Fd()))
  27. if err != nil {
  28. panic(err)
  29. }
  30. state := ui.NewState(config, width, height, printRaw)
  31. err = state.Subcommand(os.Args[1], os.Args[2])
  32. if err != nil {
  33. term.Restore(int(os.Stdin.Fd()), oldTerminal)
  34. help()
  35. return
  36. }
  37. go func() {
  38. for {
  39. time.Sleep(500 * time.Millisecond)
  40. width, height, err := term.GetSize(int(os.Stdin.Fd()))
  41. if err != nil {
  42. panic(err)
  43. }
  44. state.SetWidthHeight(width, height)
  45. }
  46. }()
  47. buffer := make([]byte, 1)
  48. for {
  49. os.Stdin.Read(buffer)
  50. input := buffer[0]
  51. if input == 3 /*(ctrl+c)*/ {
  52. printRaw("")
  53. return
  54. }
  55. go state.Update(input)
  56. }
  57. }
  58. func printRaw(output string) {
  59. output = strings.ReplaceAll(output, "\n", "\r\n")
  60. _, err := os.Stdout.WriteString("\x1b[0;0H\x1b[2J" + output)
  61. if err != nil {
  62. panic(err)
  63. }
  64. }
  65. func help() {
  66. os.Stdout.WriteString("here's the help page\n")
  67. }