WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit bd48f46

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

File tree

28 files changed

+686
-133
lines changed

28 files changed

+686
-133
lines changed

‎cmd/clip/paste.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import (
77

88
var pasteCmd = &cobra.Command{
99
Use: "paste",
10-
Short: "Paste clipboard content to the terminal",
10+
Short: "Paste clipboard content",
1111
RunE: func(cmd *cobra.Command, args []string) error {
1212
return clipboard.Paste(cmd.OutOrStdout())
1313
},

‎cmd/feature/feature.go‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package feature
22

33
import (
4-
"github.com/kloudkit/ws-cli/cmd/feature/install"
54
"github.com/kloudkit/ws-cli/internals/env"
65
"github.com/spf13/cobra"
76
)
@@ -18,5 +17,5 @@ func init() {
1817
"Root directory of extra features",
1918
)
2019

21-
FeatureCmd.AddCommand(install.InstallCmd)
20+
FeatureCmd.AddCommand(installCmd, listCmd, infoCmd)
2221
}

‎cmd/feature/info.go‎

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package feature
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
7+
"github.com/kloudkit/ws-cli/internals/features"
8+
"github.com/kloudkit/ws-cli/internals/styles"
9+
"github.com/spf13/cobra"
10+
)
11+
12+
var infoCmd = &cobra.Command{
13+
Use: "info <name>",
14+
Short: "Show detailed information about a feature",
15+
Args: cobra.ExactArgs(1),
16+
RunE: func(cmd *cobra.Command, args []string) error {
17+
featuresDir, _ := cmd.Flags().GetString("root")
18+
featureName := args[0]
19+
20+
feature, err := features.InfoFeature(featuresDir, featureName)
21+
if err != nil {
22+
return fmt.Errorf("failed to get feature info: %w", err)
23+
}
24+
25+
fmt.Fprintf(
26+
cmd.OutOrStdout(),
27+
"\n%s\n %s\n\n",
28+
styles.InfoBadge().Render(strings.ToUpper(feature.Name)),
29+
feature.Description,
30+
)
31+
32+
if len(feature.Vars) > 0 {
33+
fmt.Fprintf(
34+
cmd.OutOrStdout(),
35+
"%s\n",
36+
styles.Badge().Render("Options"),
37+
)
38+
39+
listItems := make([]any, len(feature.Vars))
40+
for i, v := range feature.Vars {
41+
listItems[i] = styles.Key().UnsetBold().Render(v)
42+
}
43+
44+
fmt.Fprintln(cmd.OutOrStdout(), styles.List(listItems...))
45+
}
46+
47+
fmt.Fprintln(cmd.OutOrStdout())
48+
return nil
49+
},
50+
}
Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package install
1+
package feature
22

33
import (
44
"context"
@@ -9,15 +9,16 @@ 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

15-
var InstallCmd = &cobra.Command{
16+
var installCmd = &cobra.Command{
1617
Use: "install",
1718
Short: "Install extra pre-configured features",
1819
}
1920

20-
var features = map[string]string{
21+
var installableFeatures = map[string]string{
2122
"cloudflared": "Install Cloudflare tunnel CLI",
2223
"codex": "Install codex CLI",
2324
"conan": "Install Conan CLI and related tools",
@@ -42,7 +43,7 @@ var features = map[string]string{
4243
var customCmd = &cobra.Command{
4344
Use: "custom",
4445
Short: "Install a custom feature",
45-
Run: install("custom"),
46+
RunE: installFeature("custom"),
4647
}
4748

4849
func runPlay(feature string, vars map[string]interface{}, errorOut io.Writer) {
@@ -60,7 +61,8 @@ 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\n", styles.ErrorBadge().Render("ERROR"))
65+
fmt.Fprintf(errorOut, "%s\n", styles.Error().Render(err.Error()))
6466
os.Exit(1)
6567
}
6668
}
@@ -69,15 +71,16 @@ func getFeaturePath(root string, feature string, errorOut io.Writer) string {
6971
feature = filepath.Join(root, feature+".yaml")
7072

7173
if _, err := os.Stat(feature); os.IsNotExist(err) {
72-
fmt.Fprintf(errorOut, "ERROR: The feature path [%s] could not be found.\n", feature)
74+
fmt.Fprintf(errorOut, "%s\n\n", styles.ErrorBadge().Render("ERROR"))
75+
fmt.Fprintf(errorOut, "%s\n", styles.Error().Render(fmt.Sprintf("The feature path [%s] could not be found", feature)))
7376
os.Exit(1)
7477
}
7578

7679
return feature
7780
}
7881

79-
func install(feature string) func(*cobra.Command, []string) {
80-
return func(cmd *cobra.Command, args []string) {
82+
func installFeature(feature string) func(*cobra.Command, []string) error {
83+
return func(cmd *cobra.Command, args []string) error {
8184
root, _ := cmd.Flags().GetString("root")
8285
rawVars, _ := cmd.Flags().GetStringToString("opt")
8386

@@ -96,11 +99,12 @@ func install(feature string) func(*cobra.Command, []string) {
9699
feature = getFeaturePath(root, feature, cmd.ErrOrStderr())
97100

98101
runPlay(feature, vars, cmd.ErrOrStderr())
102+
return nil
99103
}
100104
}
101105

102106
func init() {
103-
InstallCmd.PersistentFlags().StringToString(
107+
installCmd.PersistentFlags().StringToString(
104108
"opt",
105109
map[string]string{},
106110
"Optional variables to use during installation",
@@ -109,13 +113,13 @@ func init() {
109113
customCmd.Flags().String("feature", "", "The custom feature to install")
110114
customCmd.MarkFlagRequired("feature")
111115

112-
InstallCmd.AddCommand(customCmd)
116+
installCmd.AddCommand(customCmd)
113117

114-
for feature, description := range features {
115-
InstallCmd.AddCommand(&cobra.Command{
118+
for feature, description := range installableFeatures {
119+
installCmd.AddCommand(&cobra.Command{
116120
Use: feature,
117121
Short: description,
118-
Run: install(feature),
122+
RunE: installFeature(feature),
119123
})
120124
}
121125
}

‎cmd/feature/list.go‎

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package feature
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
7+
"github.com/kloudkit/ws-cli/internals/features"
8+
"github.com/kloudkit/ws-cli/internals/styles"
9+
"github.com/spf13/cobra"
10+
)
11+
12+
var listCmd = &cobra.Command{
13+
Use: "list",
14+
Short: "List available features that can be installed",
15+
Aliases: []string{"ls"},
16+
RunE: func(cmd *cobra.Command, args []string) error {
17+
featuresDir, _ := cmd.Flags().GetString("root")
18+
19+
availableFeatures, err := features.ListFeatures(featuresDir)
20+
if err != nil {
21+
return fmt.Errorf("failed to list features: %w", err)
22+
}
23+
24+
if len(availableFeatures) == 0 {
25+
fmt.Fprintln(cmd.OutOrStdout(), styles.Warning().Render("No features found"))
26+
return nil
27+
}
28+
29+
fmt.Fprintf(
30+
cmd.OutOrStdout(),
31+
"\n%s\n\n",
32+
styles.InfoBadge().Render(fmt.Sprintf("%d FEATURES AVAILABLE", len(availableFeatures))),
33+
)
34+
35+
featuresTable := styles.Table("NAME", "DESCRIPTION", "OPTIONS")
36+
37+
for _, feature := range availableFeatures {
38+
var options string
39+
if len(feature.Vars) > 0 {
40+
var styledVars []string
41+
for _, v := range feature.Vars {
42+
styledVars = append(styledVars, styles.Key().UnsetBold().Render(v))
43+
}
44+
options = strings.Join(styledVars, ", ")
45+
} else {
46+
options = styles.Muted().Render("-")
47+
}
48+
49+
featuresTable.Row(feature.Name, feature.Description, options)
50+
}
51+
52+
fmt.Fprintln(cmd.OutOrStdout(), featuresTable.String())
53+
54+
return nil
55+
},
56+
}

‎cmd/info/env.go‎

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,36 +12,29 @@ 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{
4133
Use: "env",
4234
Short: "Display effective workspace environment variables",
43-
Run: func(cmd *cobra.Command, args []string) {
35+
RunE: func(cmd *cobra.Command, args []string) error {
4436
showEnvironment(cmd.OutOrStdout())
37+
return nil
4538
},
4639
}
4740

‎cmd/info/extensions.go‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,20 +30,24 @@ 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\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
}
4144

4245
var extensionsCmd = &cobra.Command{
4346
Use: "extensions",
4447
Short: "Display installed extensions",
45-
Run: func(cmd *cobra.Command, args []string) {
48+
RunE: func(cmd *cobra.Command, args []string) error {
4649
showExtensions(cmd.OutOrStdout())
50+
return nil
4751
},
4852
}
4953

‎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\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: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,25 +52,38 @@ 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\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\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{
7082
Use: "uptime",
7183
Short: "Display the workspace uptime",
72-
Run: func(cmd *cobra.Command, args []string) {
84+
RunE: func(cmd *cobra.Command, args []string) error {
7385
showUptime(cmd.OutOrStdout())
86+
return nil
7487
},
7588
}
7689

0 commit comments

Comments
 (0)