Skip to content

Commit 6a496ff

Browse files
authored
Merge pull request #109 from yjinjo/master
Implement a no-paging flag and get port dynamically
2 parents 89a36f9 + 5b6fe9a commit 6a496ff

File tree

4 files changed

+91
-36
lines changed

4 files changed

+91
-36
lines changed

cmd/root.go

+11-7
Original file line numberDiff line numberDiff line change
@@ -511,14 +511,16 @@ func createServiceCommand(serviceName string) *cobra.Command {
511511

512512
sortBy := ""
513513
columns := ""
514-
limit := 0
515-
pageSize := 100 // 기본 페이지 크기
514+
rows := 0
515+
pageSize := 100
516+
noPaging := false
516517

517518
if verb == "list" {
518519
sortBy, _ = cmd.Flags().GetString("sort")
519520
columns, _ = cmd.Flags().GetString("columns")
520-
limit, _ = cmd.Flags().GetInt("limit")
521-
pageSize, _ = cmd.Flags().GetInt("page-size")
521+
rows, _ = cmd.Flags().GetInt("rows")
522+
pageSize, _ = cmd.Flags().GetInt("rows-per-page")
523+
noPaging, _ = cmd.Flags().GetBool("no-paging")
522524
}
523525

524526
options := &transport.FetchOptions{
@@ -531,8 +533,9 @@ func createServiceCommand(serviceName string) *cobra.Command {
531533
SortBy: sortBy,
532534
MinimalColumns: verb == "list" && cmd.Flag("minimal") != nil && cmd.Flag("minimal").Changed,
533535
Columns: columns,
534-
Limit: limit,
536+
Rows: rows,
535537
PageSize: pageSize,
538+
NoPaging: noPaging,
536539
}
537540

538541
if verb == "list" && !cmd.Flags().Changed("output") {
@@ -561,8 +564,9 @@ func createServiceCommand(serviceName string) *cobra.Command {
561564
cmd.Flags().StringP("sort", "s", "", "Sort by field (e.g. 'name', 'created_at')")
562565
cmd.Flags().BoolP("minimal", "m", false, "Show minimal columns")
563566
cmd.Flags().StringP("columns", "c", "", "Specific columns (-c id,name)")
564-
cmd.Flags().IntP("limit", "l", 0, "Number of rows")
565-
cmd.Flags().IntP("page-size", "n", 15, "Number of items per page")
567+
cmd.Flags().IntP("rows", "r", 0, "Number of rows")
568+
cmd.Flags().IntP("rows-per-page", "n", 15, "Number of rows per page")
569+
cmd.Flags().BoolP("no-paging", "", false, "Disable pagination and show all results")
566570

567571
// Add existing flags
568572
cmd.Flags().StringArrayP("parameter", "p", []string{}, "Input Parameter (-p <key>=<value> -p ...)")

pkg/configs/alias.go

+30-7
Original file line numberDiff line numberDiff line change
@@ -95,22 +95,45 @@ func RemoveAlias(service, key string) error {
9595
return fmt.Errorf("alias '%s' not found in service '%s'", key, service)
9696
}
9797

98+
// Delete the specific alias
9899
delete(serviceAliases, key)
100+
101+
// If service has no more aliases, remove the service
99102
if len(serviceAliases) == 0 {
100103
delete(aliases, service)
101104
} else {
102105
aliases[service] = serviceAliases
103106
}
104107

105-
config["aliases"] = aliases
108+
// Only remove aliases section if there are no services left
109+
if len(aliases) == 0 {
110+
delete(config, "aliases")
111+
newData, err := yaml.Marshal(config)
112+
if err != nil {
113+
return fmt.Errorf("failed to encode config: %v", err)
114+
}
115+
if err := os.WriteFile(settingPath, newData, 0644); err != nil {
116+
return fmt.Errorf("failed to write config: %v", err)
117+
}
118+
} else {
119+
// Keep aliases and write at the end
120+
delete(config, "aliases")
121+
newData, err := yaml.Marshal(config)
122+
if err != nil {
123+
return fmt.Errorf("failed to encode config: %v", err)
124+
}
106125

107-
newData, err := yaml.Marshal(config)
108-
if err != nil {
109-
return fmt.Errorf("failed to encode config: %v", err)
110-
}
126+
aliasData, err := yaml.Marshal(map[string]interface{}{
127+
"aliases": aliases,
128+
})
129+
if err != nil {
130+
return fmt.Errorf("failed to encode aliases: %v", err)
131+
}
111132

112-
if err := os.WriteFile(settingPath, newData, 0644); err != nil {
113-
return fmt.Errorf("failed to write config: %v", err)
133+
finalData := append(newData, aliasData...)
134+
if err := os.WriteFile(settingPath, finalData, 0644); err != nil {
135+
return fmt.Errorf("failed to write config: %v", err)
136+
}
114137
}
115138

116139
return nil

pkg/configs/endpoint.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
// GetAPIEndpoint fetches the actual API endpoint from the config endpoint
2323
func GetAPIEndpoint(endpoint string) (string, error) {
2424
// Handle gRPC+SSL protocol
25-
if strings.HasPrefix(endpoint, "grpc+ssl://") {
25+
if strings.HasPrefix(endpoint, "grpc+ssl://") || strings.HasPrefix(endpoint, "grpc://") {
2626
// For gRPC+SSL endpoints, return as is since it's already in the correct format
2727
return endpoint, nil
2828
}
@@ -66,7 +66,7 @@ func GetAPIEndpoint(endpoint string) (string, error) {
6666
// GetIdentityEndpoint fetches the identity service endpoint from the API endpoint
6767
func GetIdentityEndpoint(apiEndpoint string) (string, bool, error) {
6868
// If the endpoint is already gRPC+SSL
69-
if strings.HasPrefix(apiEndpoint, "grpc+ssl://") {
69+
if strings.HasPrefix(apiEndpoint, "grpc+ssl://") || strings.HasPrefix(apiEndpoint, "grpc://") {
7070
// Check if it contains 'identity'
7171
containsIdentity := strings.Contains(apiEndpoint, "identity")
7272

pkg/transport/service.go

+48-20
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ type Environment struct {
3838
Endpoint string `yaml:"endpoint"`
3939
Proxy string `yaml:"proxy"`
4040
Token string `yaml:"token"`
41-
URL string `yaml:"url"`
4241
}
4342

4443
type Config struct {
@@ -58,9 +57,10 @@ type FetchOptions struct {
5857
SortBy string
5958
MinimalColumns bool
6059
Columns string
61-
Limit int
60+
Rows int
6261
Page int
6362
PageSize int
63+
NoPaging bool
6464
}
6565

6666
// FetchService handles the execution of gRPC commands for all services
@@ -205,12 +205,16 @@ func FetchService(serviceName string, verb string, resourceName string, options
205205
}
206206

207207
domainParts := strings.Split(urlParts[1], ".")
208-
if len(domainParts) < 4 {
209-
return nil, fmt.Errorf("invalid domain format in API endpoint: %s", apiEndpoint)
210-
}
208+
if len(domainParts) > 0 {
209+
port := extractPortFromParts(domainParts)
210+
if strings.Contains(domainParts[len(domainParts)-1], ":") {
211+
parts := strings.Split(domainParts[len(domainParts)-1], ":")
212+
domainParts[len(domainParts)-1] = parts[0]
213+
}
211214

212-
domainParts[0] = format.ConvertServiceName(serviceName)
213-
hostPort = strings.Join(domainParts, ".") + ":443"
215+
domainParts[0] = format.ConvertServiceName(serviceName)
216+
hostPort = strings.Join(domainParts, ".") + port
217+
}
214218
} else {
215219
trimmedEndpoint := strings.TrimPrefix(identityEndpoint, "grpc+ssl://")
216220
parts := strings.Split(trimmedEndpoint, ".")
@@ -349,11 +353,10 @@ func FetchService(serviceName string, verb string, resourceName string, options
349353
}
350354
}
351355

352-
// Apply limit if specified
353-
if options.Limit > 0 && verb == "list" {
356+
if options.Rows > 0 && verb == "list" {
354357
if results, ok := respMap["results"].([]interface{}); ok {
355-
if len(results) > options.Limit {
356-
respMap["results"] = results[:options.Limit]
358+
if len(results) > options.Rows {
359+
respMap["results"] = results[:options.Rows]
357360
}
358361
}
359362
}
@@ -397,6 +400,22 @@ func extractParameterName(errMsg string) string {
397400
return ""
398401
}
399402

403+
func extractPortFromParts(parts []string) string {
404+
if len(parts) == 0 {
405+
return ":443"
406+
}
407+
408+
lastPart := parts[len(parts)-1]
409+
if strings.Contains(lastPart, ":") {
410+
portParts := strings.Split(lastPart, ":")
411+
if len(portParts) == 2 {
412+
return ":" + portParts[1]
413+
}
414+
}
415+
416+
return ":443"
417+
}
418+
400419
// promptForParameter prompts the user to enter a value for the given parameter
401420
func promptForParameter(paramName string) (string, error) {
402421
prompt := fmt.Sprintf("Please enter value for '%s'", paramName)
@@ -431,7 +450,7 @@ func loadConfig() (*Config, error) {
431450
envConfig := &Environment{
432451
Endpoint: mainV.GetString(fmt.Sprintf("environments.%s.endpoint", currentEnv)),
433452
Proxy: mainV.GetString(fmt.Sprintf("environments.%s.proxy", currentEnv)),
434-
URL: mainV.GetString(fmt.Sprintf("environments.%s.url", currentEnv)),
453+
Token: mainV.GetString(fmt.Sprintf("environments.%s.token", currentEnv)),
435454
}
436455

437456
// Handle token based on environment type
@@ -510,12 +529,16 @@ func fetchJSONResponse(config *Config, serviceName string, verb string, resource
510529
}
511530

512531
domainParts := strings.Split(urlParts[1], ".")
513-
if len(domainParts) < 4 {
514-
return nil, fmt.Errorf("invalid domain format in API endpoint: %s", apiEndpoint)
515-
}
532+
if len(domainParts) > 0 {
533+
port := extractPortFromParts(domainParts)
534+
if strings.Contains(domainParts[len(domainParts)-1], ":") {
535+
parts := strings.Split(domainParts[len(domainParts)-1], ":")
536+
domainParts[len(domainParts)-1] = parts[0]
537+
}
516538

517-
domainParts[0] = format.ConvertServiceName(serviceName)
518-
hostPort = strings.Join(domainParts, ".") + ":443"
539+
domainParts[0] = format.ConvertServiceName(serviceName)
540+
hostPort = strings.Join(domainParts, ".") + port
541+
}
519542
}
520543
} else {
521544
trimmedEndpoint := strings.TrimPrefix(identityEndpoint, "grpc+ssl://")
@@ -985,9 +1008,14 @@ func getMinimalFields(serviceName, resourceName string, refClient *grpcreflect.C
9851008

9861009
func printTable(data map[string]interface{}, options *FetchOptions, serviceName, verbName, resourceName string, refClient *grpcreflect.Client) string {
9871010
if results, ok := data["results"].([]interface{}); ok {
988-
// Set default page size if not specified
989-
if options.PageSize == 0 {
990-
options.PageSize = 10
1011+
// Set default page size if not specified and paging is enabled
1012+
if !options.NoPaging {
1013+
if options.PageSize == 0 {
1014+
options.PageSize = 15
1015+
}
1016+
} else {
1017+
// Show all results when no-paging is true
1018+
options.PageSize = len(results)
9911019
}
9921020

9931021
// Initialize keyboard

0 commit comments

Comments
 (0)