]> git.christiangoeschel.com Git - repoman-cli.git/commitdiff
Added 'checkapi' command to shell
authorchristiangoeschel <cndjomouo@icloud.com>
Thu, 3 Oct 2024 19:03:46 +0000 (15:03 -0400)
committerchristiangoeschel <cndjomouo@icloud.com>
Thu, 3 Oct 2024 19:03:46 +0000 (15:03 -0400)
main
screens/shell.go [new file with mode: 0644]
screens/viewport.go [deleted file]

diff --git a/main b/main
index 2cb362b88b7040ee0a9d743b4c891e25f0167d34..22fcefb279d0b5885314cb69d4edd54526c77fe5 100755 (executable)
Binary files a/main and b/main differ
diff --git a/screens/shell.go b/screens/shell.go
new file mode 100644 (file)
index 0000000..f3da40b
--- /dev/null
@@ -0,0 +1,259 @@
+package screens
+
+// A simple program demonstrating the text area component from the Bubbles
+// component library.
+
+import (
+       "fmt"
+       "strings"
+  "os"
+  "github.com/repoman-cli/ui"
+  "github.com/repoman-cli/api"
+       "github.com/charmbracelet/bubbles/textarea"
+       "github.com/charmbracelet/bubbles/viewport"
+       tea "github.com/charmbracelet/bubbletea"
+       "github.com/charmbracelet/lipgloss"
+)
+
+
+type (
+       errMsg error
+)
+
+type cmdReturn struct {
+  ReturnCode  int 
+  Terminated  bool 
+}
+
+type CmdExecMsg cmdReturn
+
+type RepomanShellModel struct {
+  APIStatus   api.APIStatusMsg
+       viewport    viewport.Model
+       messages    []string
+       textarea    textarea.Model
+       senderStyle lipgloss.Style
+       err         error
+  Width       int 
+  Height      int 
+  topBar      string
+  footer      string
+  CmdExecStatus   CmdExecMsg
+}
+
+func NewShellScreenModel() RepomanShellModel {
+  // Get terminal size 
+  w, h, err := ui.GetWindowSize()
+  if err != nil {
+    fmt.Printf("Could not get terminal window size.")
+    os.Exit(1)
+  }
+
+  // Top bar styling
+  roundLabelCorner  :=  ui.RoundLabelCornerStyle.Render("")
+  labelArrow        :=  ui.LabelArrowStyle.Render("")
+  titleBlock        :=  ui.TitleStyle.Render(" Repoman CLI ")
+  rightTopBarBlock  :=  ui.TopBarRightLabel.Render("  Repoman Shell  ")
+  
+  topBarBlock       :=  ui.TopBarStyle.Render(lipgloss.JoinHorizontal(lipgloss.Center,
+                        ui.TopBarLeftStyle.Width((w / 2 ) - 1).Render(roundLabelCorner + titleBlock + labelArrow), 
+                        ui.TopBarRightStyle.Width((w / 2 ) - 1).Render(rightTopBarBlock)))
+  
+  topBarBlockHeight := lipgloss.Height(topBarBlock)
+  // Footer styling
+  copyrightBlock := ui.SubtleStyle.Render("2024 Copyright - Repoman")
+  
+  helpBlock :=  fmt.Sprintf("%s\n%s\n%s", 
+                ui.SubtleStyle.Render("Ctrl+C, Esc - Exit program"),
+                ui.SubtleStyle.Render("Ctrl+D - Main menu"),
+                ui.SubtleStyle.Render("Ctrl+L - Clear Screen"))
+  
+  footerBlock := ui.FooterStyle.Render(lipgloss.JoinHorizontal(lipgloss.Center,
+                ui.FooterLeftStyle.Width((w / 2 ) - 1).Render(copyrightBlock), 
+                ui.FooterRightStyle.Width((w / 2 ) - 1).Render(helpBlock)))
+  
+  footerBlockHeight := lipgloss.Height(footerBlock)
+
+
+  ta := textarea.New()
+       ta.Placeholder = "Type in a command or enter 'help' if you are lost"
+       ta.Focus()
+
+       ta.Prompt = "┃ repoman $ ❯ "
+       ta.CharLimit = 280
+
+       ta.SetWidth(w - 2)
+       ta.SetHeight(1)
+
+       // Remove cursor line styling
+       ta.FocusedStyle.CursorLine = lipgloss.NewStyle()
+
+       ta.ShowLineNumbers = false
+  
+  var initialViewportMsg []string
+  initialViewportMsg  = append(initialViewportMsg, ui.SubtleStyle.Render(fmt.Sprintf("No, you can't run any scripts here\nThis is not Bash, Zshhh or any type of fish 󰈺\nHowever, you can manage your self-hosted git repos from here, isn't that even better ?! ( ^ . ^ )")))
+
+       vp := viewport.New(w - 2, h - topBarBlockHeight - footerBlockHeight - 1)
+       vp.SetContent(strings.Join(initialViewportMsg, "\n"))
+
+       ta.KeyMap.InsertNewline.SetEnabled(false)
+
+       return RepomanShellModel{
+    APIStatus:    api.APIStatusMsg{},
+               textarea:    ta,
+               messages:    initialViewportMsg,
+               viewport:    vp,
+               senderStyle: lipgloss.NewStyle().Foreground(lipgloss.Color("5")),
+               err:         nil,
+    Width:        w,
+    Height:       h,
+    topBar:       topBarBlock,
+    footer:       footerBlock,
+    CmdExecStatus:     CmdExecMsg{ Terminated: true },
+       }
+}
+
+func (m *RepomanShellModel) Init() tea.Cmd {
+       return textarea.Blink
+}
+
+func (m *RepomanShellModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
+       var (
+               tiCmd tea.Cmd
+               vpCmd tea.Cmd
+       )
+
+       m.textarea, tiCmd = m.textarea.Update(msg)
+       m.viewport, vpCmd = m.viewport.Update(msg)
+
+       switch msg := msg.(type) {
+       case tea.KeyMsg:
+               switch msg.Type {
+               case tea.KeyCtrlC, tea.KeyEsc:
+                       fmt.Println(m.textarea.Value())
+                       return m, tea.Quit
+    
+    case tea.KeyCtrlD:
+      mainMenu  := MainMenu()
+      return RootScreen().SwitchScreen(&mainMenu)
+
+               case tea.KeyEnter:
+      if m.CmdExecStatus.Terminated {
+        m, cmd := parseCmd(m, m.textarea.Value())
+        return m, tea.Batch(cmd, ExecNotify(0, false)) 
+      } 
+
+    case tea.KeyCtrlL:
+      m.messages  = []string{}
+       m.viewport.SetContent("$ ❯ ")
+               }
+
+       // We handle errors just like any other message
+       case errMsg:
+               m.err = msg
+               return m, nil
+    
+  case tea.WindowSizeMsg:
+    w, h, _ := ui.GetWindowSize()
+    m.Width = w
+    m.Height = h
+         m.textarea.SetWidth(w - 2)
+    m.viewport = viewport.New(w - 2, h - lipgloss.Height(m.topBar) - lipgloss.Height(m.footer) - 1)
+               m.viewport.SetContent(strings.Join(m.messages, "\n"))   
+        
+  case api.APIStatusMsg:
+    m.APIStatus = msg
+    cmdResult := fmt.Sprintf("%s\n%s", m.senderStyle.Render("$ ❯ ") + m.textarea.Value(), m.APIStatus   )
+    m.messages = append(m.messages, cmdResult) 
+    m.viewport.SetContent(strings.Join(m.messages, "\n"))
+    m.textarea.Reset()
+    //m.CmdExecStatus.Terminated = true
+    return m, ExecNotify(0, true)
+
+  case CmdExecMsg:
+    m.CmdExecStatus.Terminated = msg.Terminated
+  }
+
+       return m, tea.Batch(tiCmd, vpCmd)
+}
+
+func (m *RepomanShellModel) View() string {
+
+ // Top bar styling
+  roundLabelCorner  :=  ui.RoundLabelCornerStyle.Render("")
+  labelArrow        :=  ui.LabelArrowStyle.Render("")
+  titleBlock        :=  ui.TitleStyle.Render(" Repoman CLI ")
+  rightTopBarBlock  :=  ui.TopBarRightLabel.Render("  Repoman Shell  ")
+  
+  topBarBlock       :=  ui.TopBarStyle.Render(lipgloss.JoinHorizontal(lipgloss.Center,
+                        ui.TopBarLeftStyle.Width((m.Width / 2 ) - 1).Render(roundLabelCorner + titleBlock + labelArrow), 
+                        ui.TopBarRightStyle.Width((m.Width / 2 ) - 1).Render(rightTopBarBlock)))
+
+  m.topBar = topBarBlock
+
+// Footer styling
+  copyrightBlock := ui.SubtleStyle.Render("2024 Copyright - Repoman")
+  
+  helpBlock :=  fmt.Sprintf("%s\n%s\n%s", 
+                ui.SubtleStyle.Render("Ctrl+C, Esc - Exit program"),
+                ui.SubtleStyle.Render("Ctrl+D - Main menu"),
+                ui.SubtleStyle.Render("Ctrl+L - Clear Screen"))
+
+  footerBlock := ui.FooterStyle.Render(lipgloss.JoinHorizontal(lipgloss.Center,
+                ui.FooterLeftStyle.Width((m.Width / 2 ) - 1).Render(copyrightBlock), 
+                ui.FooterRightStyle.Width((m.Width / 2 ) - 1).Render(helpBlock)))
+  
+  m.footer = footerBlock
+
+
+  return  lipgloss.PlaceHorizontal(m.Width, lipgloss.Center, lipgloss.JoinVertical(lipgloss.Left, m.topBar, m.viewport.View(), m.textarea.View(), m.footer ))
+}
+
+
+func parseCmd(m *RepomanShellModel, cmd string) (tea.Model, tea.Cmd){
+  var cmdReturn string
+  
+  if cmd != "" {
+    switch cmd {
+    case "help", "?":
+      cmdReturn = "Well I can't help you neither buddy"
+      m.messages = append(m.messages, m.senderStyle.Render(fmt.Sprintf("$ ❯ %s\n%s", m.textarea.Value(), cmdReturn)))         
+    
+    case "checkapi":
+      return m, api.HandleAPIStatusRequest(api.StatusUrl)
+
+    case "menu", "quit":
+      mainMenuModel := MainMenu()
+      return RootScreen().SwitchScreen(&mainMenuModel)
+    
+    case "clear":
+      m.messages  = []string{}
+       m.viewport.SetContent("$ ❯ ")
+      
+    case "exit":
+      return m, tea.Quit
+
+    default:
+      m.messages = append(m.messages, m.senderStyle.Render("$ ❯ Unknown command: " + m.textarea.Value())) 
+
+    }
+  } else {    
+      m.messages = append(m.messages, m.senderStyle.Render("$ ❯ ")) 
+  }
+    
+       m.viewport.SetContent(strings.Join(m.messages, "\n"))
+       m.textarea.Reset()
+       m.viewport.GotoBottom()
+
+  return m, ExecNotify(0, true)
+}
+
+func ExecNotify(returnCode int, terminated bool ) tea.Cmd {
+    cmdReturn := CmdExecMsg{  ReturnCode: returnCode, 
+                              Terminated: terminated, }
+    return func() tea.Msg {
+      return cmdReturn 
+    }
+  }
+
diff --git a/screens/viewport.go b/screens/viewport.go
deleted file mode 100644 (file)
index a3f337e..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-package screens
-
-// A simple program demonstrating the text area component from the Bubbles
-// component library.
-
-import (
-       "fmt"
-       "strings"
-  "os"
-  "github.com/repoman-cli/ui"
-       "github.com/charmbracelet/bubbles/textarea"
-       "github.com/charmbracelet/bubbles/viewport"
-       tea "github.com/charmbracelet/bubbletea"
-       "github.com/charmbracelet/lipgloss"
-)
-
-
-type (
-       errMsg error
-)
-
-type RepomanShellModel struct {
-       viewport    viewport.Model
-       messages    []string
-       textarea    textarea.Model
-       senderStyle lipgloss.Style
-       err         error
-  Width       int 
-  Height      int 
-  topBar      string
-}
-
-func NewShellScreenModel() RepomanShellModel {
-  // Get terminal size 
-  w, h, err := ui.GetWindowSize()
-  if err != nil {
-    fmt.Printf("Could not get terminal window size.")
-    os.Exit(1)
-  }
-
-  // Top bar styling
-  roundLabelCorner  :=  ui.RoundLabelCornerStyle.Render("")
-  labelArrow        :=  ui.LabelArrowStyle.Render("")
-  titleBlock        :=  ui.TitleStyle.Render(" Repoman CLI ")
-  rightTopBarBlock  :=  ui.TopBarRightLabel.Render("  Repoman Shell  ")
-  
-  topBarBlock       :=  ui.TopBarStyle.Render(lipgloss.JoinHorizontal(lipgloss.Center,
-                        ui.TopBarLeftStyle.Width((w / 2 ) - 1).Render(roundLabelCorner + titleBlock + labelArrow), 
-                        ui.TopBarRightStyle.Width((w / 2 ) - 1).Render(rightTopBarBlock)))
-  
-  topBarBlockHeight := lipgloss.Height(topBarBlock)
-  
-  ta := textarea.New()
-       ta.Placeholder = "Type in a command or enter 'help' if you are lost"
-       ta.Focus()
-
-       ta.Prompt = "┃ repoman $ ❯ "
-       ta.CharLimit = 280
-
-       ta.SetWidth(w)
-       ta.SetHeight(1)
-
-       // Remove cursor line styling
-       ta.FocusedStyle.CursorLine = lipgloss.NewStyle()
-
-       ta.ShowLineNumbers = false
-  
-       vp := viewport.New(w, h - topBarBlockHeight - 1)
-       vp.SetContent(ui.SubtleStyle.Render(`This is not Bash, Zshhh or some type of fish 󰈺`))
-
-       ta.KeyMap.InsertNewline.SetEnabled(false)
-
-       return RepomanShellModel{
-               textarea:    ta,
-               messages:    []string{},
-               viewport:    vp,
-               senderStyle: lipgloss.NewStyle().Foreground(lipgloss.Color("5")),
-               err:         nil,
-    Width:        w,
-    Height:       h,
-    topBar:       topBarBlock,
-       }
-}
-
-func (m *RepomanShellModel) Init() tea.Cmd {
-       return textarea.Blink
-}
-
-func (m *RepomanShellModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
-       var (
-               tiCmd tea.Cmd
-               vpCmd tea.Cmd
-       )
-
-       m.textarea, tiCmd = m.textarea.Update(msg)
-       m.viewport, vpCmd = m.viewport.Update(msg)
-
-       switch msg := msg.(type) {
-       case tea.KeyMsg:
-               switch msg.Type {
-               case tea.KeyCtrlC, tea.KeyEsc:
-                       fmt.Println(m.textarea.Value())
-                       return m, tea.Quit
-
-               case tea.KeyEnter:
-      m, cmd := parseCmd(m, m.textarea.Value())
-      return m, cmd
-    case tea.KeyCtrlL:
-      m.messages  = []string{}
-       m.viewport.SetContent("$ ❯ ")
-               }
-
-       // We handle errors just like any other message
-       case errMsg:
-               m.err = msg
-               return m, nil
-
-  case tea.WindowSizeMsg:
-    w, h, _ := ui.GetWindowSize()
-    m.Width = w
-    m.Height = h
-         m.textarea.SetWidth(w)
-    m.viewport = viewport.New(w, h - lipgloss.Height(m.topBar) - 1)
-               m.viewport.SetContent(strings.Join(m.messages, "\n"))   
-       }
-
-       return m, tea.Batch(tiCmd, vpCmd)
-}
-
-func (m *RepomanShellModel) View() string {
-
- // Top bar styling
-  roundLabelCorner  :=  ui.RoundLabelCornerStyle.Render("")
-  labelArrow        :=  ui.LabelArrowStyle.Render("")
-  titleBlock        :=  ui.TitleStyle.Render(" Repoman CLI ")
-  rightTopBarBlock  :=  ui.TopBarRightLabel.Render("  Repoman Shell  ")
-  
-  topBarBlock       :=  ui.TopBarStyle.Render(lipgloss.JoinHorizontal(lipgloss.Center,
-                        ui.TopBarLeftStyle.Width((m.Width / 2 ) - 1).Render(roundLabelCorner + titleBlock + labelArrow), 
-                        ui.TopBarRightStyle.Width((m.Width / 2 ) - 1).Render(rightTopBarBlock)))
-
-  m.topBar = topBarBlock
-
-  return  lipgloss.PlaceHorizontal(m.Width, lipgloss.Center, lipgloss.JoinVertical(lipgloss.Left, m.topBar, m.viewport.View(), m.textarea.View()))
-}
-
-
-func parseCmd(m *RepomanShellModel, cmd string) (tea.Model, tea.Cmd){
-  var cmdReturn string
-  if cmd != "" {
-    switch cmd {
-    case "help", "?":
-      cmdReturn = "Well I can't help you neither buddy"
-      m.messages = append(m.messages, m.senderStyle.Render(fmt.Sprintf("$ ❯ %s\n%s", m.textarea.Value(), cmdReturn)))         
-    
-    case "menu", "quit":
-      mainMenuModel := MainMenu()
-      return RootScreen().SwitchScreen(&mainMenuModel)
-    
-    case "exit":
-      return m, tea.Quit
-
-    default:
-      m.messages = append(m.messages, m.senderStyle.Render("$ ❯ Unknown command: " + m.textarea.Value())) 
-
-    }
-  } else {    
-      m.messages = append(m.messages, m.senderStyle.Render("$ ❯ ")) 
-  }
-    
-       m.viewport.SetContent(strings.Join(m.messages, "\n"))
-       m.textarea.Reset()
-       m.viewport.GotoBottom()
-
-  return m, nil
-}