Skip to content

Commit 5a784ec

Browse files
committed
🎨 Add colors
Closes kloudkit/ws-meta#43
1 parent 5b1432a commit 5a784ec

File tree

15 files changed

+250
-70
lines changed

15 files changed

+250
-70
lines changed

‎cmd/feature/install/install.go‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
"github.com/apenella/go-ansible/v2/pkg/execute"
1111
"github.com/apenella/go-ansible/v2/pkg/playbook"
12+
"github.com/kloudkit/ws-cli/internals/styles"
1213
"github.com/spf13/cobra"
1314
)
1415

@@ -60,7 +61,7 @@ func runPlay(feature string, vars map[string]interface{}, errorOut io.Writer) {
6061
err := exec.Execute(context.Background())
6162

6263
if err != nil {
63-
fmt.Fprintln(errorOut, err)
64+
fmt.Fprintf(errorOut, "%s\n", styles.Error().Render(fmt.Sprintf("Error: %v", err)))
6465
os.Exit(1)
6566
}
6667
}
@@ -69,7 +70,7 @@ func getFeaturePath(root string, feature string, errorOut io.Writer) string {
6970
feature = filepath.Join(root, feature+".yaml")
7071

7172
if _, err := os.Stat(feature); os.IsNotExist(err) {
72-
fmt.Fprintf(errorOut, "ERROR: The feature path [%s] could not be found.\n", feature)
73+
fmt.Fprintf(errorOut, "%s\n", styles.Error().Render(fmt.Sprintf("Error: The feature path [%s] could not be found", feature)))
7374
os.Exit(1)
7475
}
7576

‎cmd/info/env.go‎

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,29 +12,21 @@ import (
1212
)
1313

1414
func showEnvironment(writer io.Writer) {
15-
fmt.Fprintln(writer, styles.Header().Render("Environment Variables"))
16-
17-
var envVars [][]string
18-
for key, value := range env.GetAll() {
15+
allVars := env.GetAll()
16+
var wsVars [][]string
17+
for key, value := range allVars {
1918
if strings.HasPrefix(key, "WS_") {
20-
envVars = append(envVars, []string{key, value})
19+
wsVars = append(wsVars, []string{key, value})
2120
}
2221
}
2322

24-
if len(envVars) == 0 {
25-
fmt.Fprintln(writer, styles.Warning().Render(" No environment variables found"))
26-
return
27-
}
23+
fmt.Fprintf(writer, "\n%s\n\n", styles.InfoBadge().Render(fmt.Sprintf("%d WORKSPACE VARIABLES", len(wsVars))))
2824

29-
sort.Slice(envVars, func(i, j int) bool {
30-
return envVars[i][0] < envVars[j][0]
25+
sort.Slice(wsVars, func(i, j int) bool {
26+
return wsVars[i][0] < wsVars[j][0]
3127
})
3228

33-
t := styles.Table("Variable", "Value").
34-
Rows(envVars...)
35-
36-
fmt.Fprintln(writer)
37-
fmt.Fprintln(writer, t.Render())
29+
fmt.Fprintf(writer, "%s\n\n", styles.Table().Rows(wsVars...).Render())
3830
}
3931

4032
var envCmd = &cobra.Command{

‎cmd/info/extensions.go‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,14 @@ func fetchExtensions() [][]string {
3030
}
3131

3232
func showExtensions(writer io.Writer) {
33-
fmt.Fprintln(writer, styles.Header().Render("Extensions"))
33+
extensions := fetchExtensions()
34+
35+
fmt.Fprintf(writer, "\n%s\n", styles.InfoBadge().Render(fmt.Sprintf("%d Extensions", len(extensions))))
36+
3437
fmt.Fprintln(writer)
3538

3639
t := styles.Table("Name", "Version").
37-
Rows(fetchExtensions()...)
40+
Rows(extensions...)
3841

3942
fmt.Fprintln(writer, t.Render())
4043
}

‎cmd/info/info.go‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,15 @@ func readJson(content map[string]any, key string) string {
4444
func showVersion(writer io.Writer) {
4545
content := readJsonFile()
4646

47-
fmt.Fprintln(writer, styles.Header().Render("Versions"))
47+
fmt.Fprintf(writer, "\n%s\n", styles.InfoBadge().Render("VERSIONS"))
48+
4849
fmt.Fprintln(writer)
4950

50-
t := styles.Table("", "Value").
51-
Rows(
52-
[]string{"workspace", readJson(content, "version")},
53-
[]string{"ws-cli", Version},
54-
[]string{"VSCode", readJson(content, "vscode.version")},
55-
)
51+
t := styles.Table().Rows(
52+
[]string{"workspace", readJson(content, "version")},
53+
[]string{"ws-cli", Version},
54+
[]string{"VSCode", readJson(content, "vscode.version")},
55+
)
5656

5757
fmt.Fprintln(writer, t.Render())
5858
}

‎cmd/info/uptime.go‎

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,30 @@ func humanizeDuration(duration time.Duration) string {
5252
}
5353

5454
func showUptime(writer io.Writer) {
55-
started, running, _ := readStartup()
55+
started, running, err := readStartup()
5656

57-
fmt.Fprintln(writer, styles.Header().Render("Uptime"))
58-
fmt.Fprintln(writer)
57+
if err != nil {
58+
fmt.Fprintf(writer, "%s\n", styles.WarningBadge().Render("WARNING"))
59+
fmt.Fprintf(writer, "%s\n", styles.Warning().Render("Could not read workspace startup time"))
60+
return
61+
}
62+
63+
var statusBadge string
64+
if running.Hours() < 1 {
65+
statusBadge = styles.InfoBadge().Render("RECENTLY STARTED")
66+
} else if running.Hours() < 36 {
67+
statusBadge = styles.SuccessBadge().Render("ACTIVE")
68+
} else {
69+
statusBadge = styles.Highlighted().Render("LONG RUNNING")
70+
}
71+
fmt.Fprintf(writer, "\n%s\n", statusBadge)
5972

60-
t := styles.Table("", "Value").
61-
Rows(
62-
[]string{"started", started.String()},
63-
[]string{"running", humanizeDuration(running)},
64-
)
73+
t := styles.Table().Rows(
74+
[]string{"Started at", styles.Code().Render(started.Format("2006-01-02 15:04:05 MST"))},
75+
[]string{"Running for", styles.Value().Render(humanizeDuration(running))},
76+
)
6577

66-
fmt.Fprintln(writer, t.Render())
78+
fmt.Fprintf(writer, "%s\n\n", t.Render())
6779
}
6880

6981
var uptimeCmd = &cobra.Command{

‎cmd/logs/logs.go‎

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,19 @@ func execute(cmd *cobra.Command, args []string) {
2222
level, _ := cmd.Flags().GetString("level")
2323

2424
if level != "" && level != "info" && level != "warn" && level != "error" && level != "debug" {
25-
fmt.Fprintln(cmd.ErrOrStderr(), styles.Error().Render("Invalid log level. Must be one of: debug, info, warn, error"))
25+
fmt.Fprintf(cmd.ErrOrStderr(), "%s\n\n", styles.ErrorBadge().Render("ERROR"))
26+
fmt.Fprintln(cmd.ErrOrStderr(), styles.Error().Render("Invalid log level. Must be one of:"))
27+
fmt.Fprintf(cmd.ErrOrStderr(), " %s %s\n", styles.Code().Render("debug"), styles.Muted().Render("- Debug information"))
28+
fmt.Fprintf(cmd.ErrOrStderr(), " %s %s\n", styles.Code().Render("info"), styles.Muted().Render("- General information"))
29+
fmt.Fprintf(cmd.ErrOrStderr(), " %s %s\n", styles.Code().Render("warn"), styles.Muted().Render("- Warning messages"))
30+
fmt.Fprintf(cmd.ErrOrStderr(), " %s %s\n", styles.Code().Render("error"), styles.Muted().Render("- Error messages only"))
2631
os.Exit(1)
2732
}
2833

2934
reader, err := logger.NewReader(tail, level)
3035
if err != nil {
31-
fmt.Fprintln(cmd.ErrOrStderr(), styles.Error().Render(fmt.Sprintf("Error: %s", err)))
36+
fmt.Fprintf(cmd.ErrOrStderr(), "%s\n", styles.ErrorBadge().Render("ERROR"))
37+
fmt.Fprintln(cmd.ErrOrStderr(), styles.Error().Render(fmt.Sprintf("Failed to initialize log reader: %s", err)))
3238
os.Exit(1)
3339
}
3440

@@ -39,6 +45,7 @@ func execute(cmd *cobra.Command, args []string) {
3945
}
4046

4147
if err != nil {
48+
fmt.Fprintf(cmd.ErrOrStderr(), "%s\n", styles.ErrorBadge().Render("ERROR"))
4249
fmt.Fprintln(cmd.ErrOrStderr(), styles.Error().Render(fmt.Sprintf("Error reading logs: %s", err)))
4350
os.Exit(1)
4451
}

‎cmd/root.go‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,17 @@ var versionCmd = &cobra.Command{
3535

3636
func Execute() {
3737
if err := rootCmd.Execute(); err != nil {
38-
fmt.Println(err)
38+
fmt.Fprintf(os.Stderr, "%s\n", styles.Error().Render(fmt.Sprintf("Error: %v", err)))
3939
os.Exit(1)
4040
}
4141
}
4242

4343
func init() {
4444
rootCmd.PersistentFlags().BoolVar(&noColor, "no-color", false, "Disable color output")
4545

46+
rootCmd.SetHelpTemplate(styles.HelpTemplate())
47+
rootCmd.SetUsageTemplate(styles.UsageTemplate())
48+
4649
cobra.OnInitialize(func() {
4750
if _, exists := os.LookupEnv("WS_LOGGING_NO_COLOR"); exists {
4851
styles.ColorEnabled = false

‎cmd/serve/current.go‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package serve
22

33
import (
4+
"fmt"
45
"os"
56

67
"github.com/kloudkit/ws-cli/internals/server"
8+
"github.com/kloudkit/ws-cli/internals/styles"
79
"github.com/spf13/cobra"
810
)
911

@@ -21,12 +23,12 @@ var currentCmd = &cobra.Command{
2123

2224
currentDir, err := os.Getwd()
2325
if err != nil {
24-
cmd.PrintErrf("Error getting current directory: %v\n", err)
26+
fmt.Fprintf(cmd.ErrOrStderr(), "%s\n", styles.Error().Render(fmt.Sprintf("Error getting current directory: %v", err)))
2527
os.Exit(1)
2628
}
2729

2830
if err := server.ServeDirectory(config, currentDir, "current directory"); err != nil {
29-
cmd.PrintErrf("Error starting server: %v\n", err)
31+
fmt.Fprintf(cmd.ErrOrStderr(), "%s\n", styles.Error().Render(fmt.Sprintf("Error starting server: %v", err)))
3032
os.Exit(1)
3133
}
3234
},

‎cmd/serve/font.go‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package serve
22

33
import (
4+
"fmt"
45
"os"
56

67
"github.com/kloudkit/ws-cli/internals/server"
8+
"github.com/kloudkit/ws-cli/internals/styles"
79
"github.com/spf13/cobra"
810
)
911

@@ -20,7 +22,7 @@ var fontCmd = &cobra.Command{
2022
}
2123

2224
if err := server.ServeDirectory(config, "/usr/share/fonts/", "fonts"); err != nil {
23-
cmd.PrintErrf("Error starting server: %v\n", err)
25+
fmt.Fprintf(cmd.ErrOrStderr(), "%s\n", styles.Error().Render(fmt.Sprintf("Error starting server: %v", err)))
2426
os.Exit(1)
2527
}
2628
},

‎cmd/template/apply.go‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@ func runApply(cmd *cobra.Command, args []string) error {
2828
config, _ := template.GetTemplate(templateName)
2929
sourcePath := template.SupportedTemplates[templateName].SourcePath
3030

31-
fmt.Fprintf(cmd.OutOrStdout(), "%s\n", styles.Success().Render("Template applied successfully:"))
32-
fmt.Fprintf(cmd.OutOrStdout(), " %s %s\n", styles.Key().Render("Source:"), sourcePath)
33-
fmt.Fprintf(cmd.OutOrStdout(), " %s %s/%s\n", styles.Key().Render("Target:"), targetPath, config.OutputName)
31+
fmt.Fprintf(cmd.OutOrStdout(), "%s\n\n", styles.SuccessBadge().Render("SUCCESS"))
32+
fmt.Fprintf(cmd.OutOrStdout(), "%s\n\n", styles.Success().Render("Template applied successfully"))
33+
fmt.Fprintf(cmd.OutOrStdout(), " %s %s\n", styles.Key().Render("Source:"), styles.Code().Render(sourcePath))
34+
fmt.Fprintf(cmd.OutOrStdout(), " %s %s\n", styles.Key().Render("Target:"), styles.Code().Render(fmt.Sprintf("%s/%s", targetPath, config.OutputName)))
35+
fmt.Fprintf(cmd.OutOrStdout(), "\n%s\n", styles.Muted().Render("💡 Use 'ws-cli template show --local "+templateName+"' to view the applied template"))
3436

3537
return nil
3638
}

0 commit comments

Comments
 (0)