github.com/kubeshop/testkube@v1.17.23/pkg/ui/printers.go (about)

     1  package ui
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"strings"
     7  
     8  	"github.com/pterm/pterm"
     9  )
    10  
    11  var (
    12  	h1        = pterm.DefaultHeader.WithBackgroundStyle(pterm.NewStyle(pterm.BgDefault, pterm.Bold)).WithTextStyle(pterm.NewStyle(pterm.FgLightMagenta)).WithMargin(0)
    13  	h2        = pterm.DefaultHeader.WithBackgroundStyle(pterm.NewStyle(pterm.BgDefault, pterm.Bold)).WithTextStyle(pterm.NewStyle(pterm.FgLightGreen)).WithMargin(0)
    14  	paragraph = pterm.DefaultParagraph.WithMaxWidth(100)
    15  )
    16  
    17  // H1 prints h1 like header
    18  func (ui *UI) H1(text string) {
    19  	h1.WithWriter(ui.Writer).Println(text)
    20  }
    21  
    22  // H1 prints h2 like header
    23  func (ui *UI) H2(text string) {
    24  	h2.WithWriter(ui.Writer).Println(text)
    25  }
    26  
    27  func (ui *UI) Paragraph(text string) {
    28  	paragraph.WithWriter(ui.Writer).Println(text)
    29  }
    30  
    31  func (ui *UI) NL(amount ...int) {
    32  	if len(amount) > 0 && amount[0] > 0 {
    33  		for i := 0; i < amount[0]-1; i++ {
    34  			fmt.Fprintln(ui.Writer)
    35  		}
    36  	}
    37  	fmt.Fprintln(ui.Writer)
    38  }
    39  
    40  // Success shows success in terminal
    41  func (ui *UI) Success(message string, subMessages ...string) {
    42  	fmt.Fprintf(ui.Writer, "%s", LightYellow(message))
    43  	for _, sub := range subMessages {
    44  		fmt.Fprintf(ui.Writer, " %s", LightCyan(sub))
    45  	}
    46  	fmt.Fprintf(ui.Writer, " "+IconMedal)
    47  	fmt.Fprintln(ui.Writer)
    48  }
    49  
    50  // SuccessAndExit shows success in terminal and exit
    51  func (ui *UI) SuccessAndExit(message string, subMessages ...string) {
    52  	ui.Success(message, subMessages...)
    53  	os.Exit(0)
    54  }
    55  
    56  // Warn shows warning in terminal
    57  func (ui *UI) Warn(message string, subMessages ...string) {
    58  	fmt.Fprintf(ui.Writer, "%s", LightYellow(message))
    59  	for _, sub := range subMessages {
    60  		fmt.Fprintf(ui.Writer, " %s", LightCyan(sub))
    61  	}
    62  	fmt.Fprintln(ui.Writer)
    63  }
    64  
    65  func (ui *UI) Alert(message string, subMessages ...string) {
    66  	fmt.Fprintf(ui.Writer, "%s", White(message))
    67  	for _, sub := range subMessages {
    68  		fmt.Fprintf(ui.Writer, " %s", LightRed(sub))
    69  	}
    70  	fmt.Fprintln(ui.Writer)
    71  }
    72  
    73  func (ui *UI) LogLine(message string) {
    74  	fmt.Fprintf(ui.Writer, "%s\n", DarkGray(message))
    75  }
    76  
    77  func (ui *UI) Debug(message string, subMessages ...string) {
    78  	if !ui.Verbose {
    79  		return
    80  	}
    81  	fmt.Fprintf(ui.Writer, "%s", DarkGray(message))
    82  	for _, sub := range subMessages {
    83  		fmt.Fprintf(ui.Writer, " %s", LightGray(sub))
    84  	}
    85  	fmt.Fprintln(ui.Writer)
    86  }
    87  
    88  func (ui *UI) Print(message string, subMessages ...string) {
    89  	fmt.Fprintf(ui.Writer, "%s", White(message))
    90  	for _, sub := range subMessages {
    91  		fmt.Fprintf(ui.Writer, " %s", White(sub))
    92  	}
    93  	fmt.Fprintln(ui.Writer)
    94  }
    95  
    96  func (ui *UI) Printf(format string, data ...any) {
    97  	fmt.Fprintf(ui.Writer, format, data...)
    98  	fmt.Fprintln(ui.Writer)
    99  }
   100  
   101  func (ui *UI) PrintDot() {
   102  	fmt.Fprint(ui.Writer, ".")
   103  }
   104  
   105  // PrintEnabled shows enabled in terminal
   106  func (ui *UI) PrintEnabled(message string, subMessages ...string) {
   107  	fmt.Fprintf(ui.Writer, IconMedal+"  ")
   108  	fmt.Fprintf(ui.Writer, "%s", White(message))
   109  	for _, sub := range subMessages {
   110  		fmt.Fprintf(ui.Writer, " %s", Green(sub))
   111  	}
   112  	fmt.Fprintln(ui.Writer)
   113  }
   114  
   115  // PrintDisabled shows insuccess in terminal
   116  func (ui *UI) PrintDisabled(message string, subMessages ...string) {
   117  	fmt.Fprintf(ui.Writer, IconCross+"  ")
   118  	fmt.Fprintf(ui.Writer, "%s", White(message))
   119  	for _, sub := range subMessages {
   120  		fmt.Fprintf(ui.Writer, " %s", LightMagenta(sub))
   121  	}
   122  	fmt.Fprintln(ui.Writer)
   123  }
   124  
   125  func (ui *UI) Info(message string, subMessages ...string) {
   126  	fmt.Fprintf(ui.Writer, "%s", DarkGray(message))
   127  	for _, sub := range subMessages {
   128  		fmt.Fprintf(ui.Writer, " %s", LightGray(sub))
   129  	}
   130  	fmt.Fprintln(ui.Writer)
   131  }
   132  
   133  func (ui *UI) Err(err error) {
   134  	fmt.Fprintf(ui.Writer, "%s %s %s\n", LightRed("⨯"), Red(err.Error()), IconError)
   135  }
   136  
   137  func (ui *UI) Errf(err string, params ...interface{}) {
   138  	fmt.Fprintf(ui.Writer, "%s %s\n", LightRed("⨯"), Red(fmt.Sprintf(err, params...)))
   139  }
   140  
   141  func (ui *UI) Fail(err error) {
   142  	ui.Writer = os.Stderr
   143  	ui.Err(err)
   144  	fmt.Fprintln(ui.Writer)
   145  	os.Exit(1)
   146  }
   147  
   148  func (ui *UI) Failf(err string, params ...interface{}) {
   149  	ui.Writer = os.Stderr
   150  	ui.Errf(err, params...)
   151  	fmt.Fprintln(ui.Writer)
   152  	os.Exit(1)
   153  }
   154  
   155  func (ui *UI) CommandOutput(output []byte, command string, params ...string) {
   156  	fullCommand := fmt.Sprintf("%s %s", LightCyan(command), DarkGray(strings.Join(params, " ")))
   157  	fmt.Fprintf(ui.Writer, "command: %s\noutput:\n%s\n", LightGray(fullCommand), DarkGray(string(output)))
   158  }
   159  
   160  func (ui *UI) Medal() {
   161  	ui.Completed("Congratulations! - Here's your medal: " + IconMedal)
   162  }
   163  
   164  func (ui *UI) Completed(main string, sub ...string) {
   165  	fmt.Fprintln(ui.Writer)
   166  	if len(sub) == 1 {
   167  		fmt.Fprintf(ui.Writer, "%s: %s\n", LightGray(main), LightBlue(sub[0]))
   168  	} else {
   169  		fmt.Fprintln(ui.Writer, LightGray(main), LightBlue(strings.Join(sub, " ")))
   170  	}
   171  }
   172  
   173  func (ui *UI) GroupCompleted(main string, sub ...string) {
   174  	fmt.Fprintln(ui.Writer)
   175  	line := strings.Repeat("=", ui.calculateMessageLength(main, sub...))
   176  	fmt.Fprintln(ui.Writer, LightBlue(line))
   177  	if len(sub) == 1 {
   178  		fmt.Fprintf(ui.Writer, "%s: %s", LightGray(main), LightBlue(sub[0]))
   179  	} else {
   180  		fmt.Fprintln(ui.Writer, LightGray(main))
   181  	}
   182  }
   183  
   184  func (ui *UI) InfoGrid(table map[string]string) {
   185  	for k, v := range table {
   186  		fmt.Fprintf(ui.Writer, "  %s: %s\n", DarkGray(k), LightBlue(v))
   187  	}
   188  	fmt.Fprintln(ui.Writer)
   189  }
   190  
   191  func (ui *UI) Properties(table [][]string) {
   192  	for _, properties := range table {
   193  		if len(properties) > 1 && properties[0] == Separator {
   194  			fmt.Fprintln(ui.Writer)
   195  			continue
   196  		}
   197  
   198  		if len(properties) == 1 {
   199  			fmt.Fprintf(ui.Writer, "  %s\n", Default(properties[0]))
   200  			fmt.Fprintf(ui.Writer, "  %s\n", Default(strings.Repeat("-", len(properties[0]))))
   201  		}
   202  
   203  		if len(properties) == 2 {
   204  			fmt.Fprintf(ui.Writer, "  %s: %s\n", White(properties[0]), LightBlue(properties[1]))
   205  		}
   206  	}
   207  	fmt.Fprintln(ui.Writer)
   208  }
   209  
   210  func (ui *UI) Vector(table []string) {
   211  	for _, v := range table {
   212  		fmt.Fprintf(ui.Writer, "  %s\n", DarkGray(v))
   213  	}
   214  }
   215  
   216  // Warn shows warning in terminal
   217  func (ui *UI) ShellCommand(title string, commands ...string) {
   218  	fmt.Fprintf(ui.Writer, "%s:\n", White(title))
   219  	for _, sub := range commands {
   220  		fmt.Fprintf(ui.Writer, "$ %s\n", LightGray(sub))
   221  	}
   222  	fmt.Fprintln(ui.Writer)
   223  }
   224  
   225  func (ui *UI) calculateMessageLength(message string, subMessages ...string) int {
   226  	sum := 0
   227  	for _, sub := range subMessages {
   228  		sum += len(sub) + 1 // space
   229  	}
   230  
   231  	return sum + len(message)
   232  }
   233  
   234  func (ui *UI) Link(message string, subMessages ...string) {
   235  	fmt.Fprintf(ui.Writer, "%s", LightGray(message))
   236  	for _, sub := range subMessages {
   237  		fmt.Fprintf(ui.Writer, " %s", LightGray(sub))
   238  	}
   239  	fmt.Fprintln(ui.Writer)
   240  }
   241  
   242  func (ui *UI) ExecutionLink(message string, subMessages ...string) {
   243  	fmt.Fprintf(ui.Writer, "%s", LightBlue(message))
   244  	for _, sub := range subMessages {
   245  		fmt.Fprintf(ui.Writer, " %s", LightBlue(sub))
   246  	}
   247  	fmt.Fprintln(ui.Writer)
   248  }