user_view.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package hhc_mangekyo
  2. import (
  3. "fmt"
  4. "git.swzry.com/zry/go-hhc-cli/hhc_ast"
  5. "git.swzry.com/zry/go-hhc-cli/hhc_telws"
  6. "git.swzry.com/zry/go-hhc-cli/hhc_validators"
  7. "git.swzry.com/zry/go-hhc-cli/hhccli"
  8. "strconv"
  9. )
  10. type MangekyoUserView struct {
  11. treeroot *hhc_ast.SyntaxDefinitionTreeRoot
  12. ctx *hhc_telws.TelwsSessionContext
  13. cvps []MangekyoCustomViewPortalCommandDefine
  14. cli *hhccli.TerminalInteractive
  15. }
  16. func NewMangeKyoUserView(
  17. ctx *hhc_telws.TelwsSessionContext,
  18. cvps []MangekyoCustomViewPortalCommandDefine,
  19. cli *hhccli.TerminalInteractive,
  20. ) *MangekyoUserView {
  21. uv := &MangekyoUserView{
  22. ctx: ctx,
  23. cvps: cvps,
  24. cli: cli,
  25. }
  26. uv.makeTree()
  27. return uv
  28. }
  29. func (uv *MangekyoUserView) GetSDTRoot() *hhc_ast.SyntaxDefinitionTreeRoot {
  30. return uv.treeroot
  31. }
  32. func (uv *MangekyoUserView) makeTree() {
  33. uv.treeroot = &hhc_ast.SyntaxDefinitionTreeRoot{}
  34. for _, v := range uv.cvps {
  35. cmd := &hhc_ast.SDTNode_Command{
  36. Name: v.CommandName,
  37. Description: v.Description,
  38. }
  39. end := &hhc_ast.SDTNode_End{
  40. Exec: func(ectx *hhc_ast.ExecUserContext) {
  41. fview := v.GetViewNameFunc
  42. fprompt := v.GetPromptFunc
  43. ftitle := v.GetTitleFunc
  44. ectx.ChangeView(fview(uv.ctx))
  45. ectx.ChangePrompt(fprompt(uv.ctx))
  46. ectx.ChangeTitle(ftitle(uv.ctx))
  47. },
  48. }
  49. cmd.AddEnd(end)
  50. uv.treeroot.AddCommand(cmd)
  51. }
  52. uv.addCommands()
  53. }
  54. func (uv *MangekyoUserView) addCommands() {
  55. c_termwidth := &hhc_ast.SDTNode_Command{
  56. Name: "termwidth",
  57. Description: "Set terminal width",
  58. }
  59. c_termwidth_arg1 := &hhc_ast.SDTNode_Argument{
  60. FormatDescription: "INTEGER<10-1024>",
  61. Description: "Terminal width",
  62. Validator: hhc_validators.RangedInteger{
  63. Min: 10,
  64. Max: 1024,
  65. }.Validate,
  66. }
  67. c_termwidth_arg1_end := &hhc_ast.SDTNode_End{
  68. Exec: uv.execTermwidth,
  69. }
  70. c_termwidth_arg1.AddEnd(c_termwidth_arg1_end)
  71. c_termwidth.AddValArgument(c_termwidth_arg1)
  72. uv.treeroot.AddCommand(c_termwidth)
  73. c_disp := &hhc_ast.SDTNode_Command{
  74. Name: "disp",
  75. Description: "Display information",
  76. }
  77. c_disp_termwidth := &hhc_ast.SDTNode_Command{
  78. Name: "termwidth",
  79. Description: "Display terminal width",
  80. }
  81. c_disp_termwidth_end := &hhc_ast.SDTNode_End{
  82. Exec: uv.execDispTermwidth,
  83. }
  84. c_disp_termwidth.AddEnd(c_disp_termwidth_end)
  85. c_disp.AddSubCommand(c_disp_termwidth)
  86. uv.treeroot.AddCommand(c_disp)
  87. }
  88. func (uv *MangekyoUserView) execDispTermwidth(ctx *hhc_ast.ExecUserContext) {
  89. tw := uv.cli.GetTerminalWidth()
  90. ctx.ResultPrintSingleLineString(fmt.Sprintf("Terminal width: %d", tw))
  91. }
  92. func (uv *MangekyoUserView) execTermwidth(ctx *hhc_ast.ExecUserContext) {
  93. v, ok := ctx.GetArgument(1)
  94. if !ok {
  95. ctx.ResultPrintSingleLineString(" % invalid argument")
  96. return
  97. }
  98. n, err := strconv.Atoi(v)
  99. if err != nil {
  100. ctx.ResultPrintSingleLineString(fmt.Sprintf(" %% invalid argument: %s", v))
  101. return
  102. }
  103. if n < 10 {
  104. ctx.ResultPrintSingleLineString(" % invalid argument - too small")
  105. return
  106. }
  107. if n > 1024 {
  108. ctx.ResultPrintSingleLineString(" % invalid argument - too large")
  109. return
  110. }
  111. uv.cli.SetTerminalWidth(n)
  112. ctx.ResultPrintSingleLineString(fmt.Sprintf("Terminal width set to %d.", n))
  113. }