projects.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package cmd
  2. import (
  3. "encoding/json"
  4. "os"
  5. "charm.land/lipgloss/v2"
  6. "charm.land/lipgloss/v2/table"
  7. "github.com/charmbracelet/crush/internal/projects"
  8. "github.com/charmbracelet/x/term"
  9. "github.com/spf13/cobra"
  10. )
  11. var projectsCmd = &cobra.Command{
  12. Use: "projects",
  13. Short: "List project directories",
  14. Long: "List directories where Crush project data is known to exist",
  15. Example: `
  16. # List all projects in a table
  17. crush projects
  18. # Output projects data as JSON
  19. crush projects --json
  20. `,
  21. RunE: func(cmd *cobra.Command, args []string) error {
  22. jsonOutput, _ := cmd.Flags().GetBool("json")
  23. projectList, err := projects.List()
  24. if err != nil {
  25. return err
  26. }
  27. if jsonOutput {
  28. output := struct {
  29. Projects []projects.Project `json:"projects"`
  30. }{Projects: projectList}
  31. data, err := json.Marshal(output)
  32. if err != nil {
  33. return err
  34. }
  35. cmd.Println(string(data))
  36. return nil
  37. }
  38. if len(projectList) == 0 {
  39. cmd.Println("No projects tracked yet.")
  40. return nil
  41. }
  42. if term.IsTerminal(os.Stdout.Fd()) {
  43. // We're in a TTY: make it fancy.
  44. t := table.New().
  45. Border(lipgloss.RoundedBorder()).
  46. StyleFunc(func(row, col int) lipgloss.Style {
  47. return lipgloss.NewStyle().Padding(0, 2)
  48. }).
  49. Headers("Path", "Data Dir", "Last Accessed")
  50. for _, p := range projectList {
  51. t.Row(p.Path, p.DataDir, p.LastAccessed.Local().Format("2006-01-02 15:04"))
  52. }
  53. lipgloss.Println(t)
  54. return nil
  55. }
  56. // Not a TTY: plain output
  57. for _, p := range projectList {
  58. cmd.Printf("%s\t%s\t%s\n", p.Path, p.DataDir, p.LastAccessed.Format("2006-01-02T15:04:05Z07:00"))
  59. }
  60. return nil
  61. },
  62. }
  63. func init() {
  64. projectsCmd.Flags().Bool("json", false, "Output as JSON")
  65. }