mirror of https://gitlab.com/gitlab-org/cli.git
88 lines
2.4 KiB
Go
88 lines
2.4 KiB
Go
package utils
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
var lineRE = regexp.MustCompile(`(?m)^`)
|
|
|
|
func Indent(s, indent string) string {
|
|
if strings.TrimSpace(s) == "" {
|
|
return s
|
|
}
|
|
return lineRE.ReplaceAllLiteralString(s, indent)
|
|
}
|
|
|
|
type ListTitleOptions struct {
|
|
// Name of the List to be used in constructing Description and EmptyMessage if not provided.
|
|
Name string
|
|
// Page represents the page number of the current page
|
|
Page int
|
|
// CurrentPageTotal is the total number of items in current page
|
|
CurrentPageTotal int
|
|
// Total number of records. Default is the total number of rows.
|
|
// Can be set to be greater than the total number of rows especially, if the list is paginated
|
|
Total int
|
|
// RepoName represents the name of the project or repository
|
|
RepoName string
|
|
// ListActionType should be either "search" or "list". Default is list
|
|
ListActionType string
|
|
// Optional. EmptyMessage to display when List is empty. If not provided, default one constructed from list Name.
|
|
EmptyMessage string
|
|
}
|
|
|
|
func NewListTitle(listName string) ListTitleOptions {
|
|
return ListTitleOptions{
|
|
Name: strings.TrimSpace(listName),
|
|
ListActionType: "list",
|
|
Page: 1,
|
|
}
|
|
}
|
|
|
|
func (opts *ListTitleOptions) Describe() string {
|
|
var pageNumInfo string
|
|
var pageInfo string
|
|
|
|
if opts.Total != 0 {
|
|
opts.Name = pluralizeName(opts.Total, opts.Name)
|
|
pageNumInfo = fmt.Sprintf("%d of %d", opts.CurrentPageTotal, opts.Total)
|
|
} else {
|
|
opts.Name = pluralizeName(opts.CurrentPageTotal, opts.Name)
|
|
pageNumInfo = fmt.Sprintf("%d", opts.CurrentPageTotal)
|
|
}
|
|
|
|
if opts.Page != 0 {
|
|
pageInfo = fmt.Sprintf("(Page %d)", opts.Page)
|
|
}
|
|
|
|
if opts.ListActionType == "search" {
|
|
if opts.CurrentPageTotal > 0 {
|
|
return fmt.Sprintf("Showing %s %s in %s that match your search %s\n", pageNumInfo, opts.Name,
|
|
opts.RepoName, pageInfo)
|
|
}
|
|
|
|
return fmt.Sprintf("No %s match your search in %s\n", opts.Name, opts.RepoName)
|
|
}
|
|
|
|
if opts.CurrentPageTotal > 0 {
|
|
if opts.RepoName == "" {
|
|
return fmt.Sprintf("Showing %s %s %s\n", pageNumInfo, opts.Name, pageInfo)
|
|
} else {
|
|
return fmt.Sprintf("Showing %s %s on %s %s\n", pageNumInfo, opts.Name, opts.RepoName, pageInfo)
|
|
}
|
|
}
|
|
|
|
emptyMessage := opts.EmptyMessage
|
|
if emptyMessage == "" {
|
|
return fmt.Sprintf("No %s available on %s", opts.Name, opts.RepoName)
|
|
}
|
|
|
|
return emptyMessage
|
|
}
|
|
|
|
func pluralizeName(num int, thing string) string {
|
|
return strings.TrimPrefix(Pluralize(num, thing), fmt.Sprintf("%d ", num))
|
|
}
|