print.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package text
  2. import (
  3. "fmt"
  4. "os"
  5. "strconv"
  6. "strings"
  7. "syscall"
  8. "github.com/leonelquinteros/gotext"
  9. "golang.org/x/sys/unix"
  10. )
  11. const (
  12. arrow = "==>"
  13. smallArrow = " ->"
  14. opSymbol = "::"
  15. )
  16. var cachedColumnCount = -1
  17. func OperationInfoln(a ...interface{}) {
  18. fmt.Fprint(os.Stdout, append([]interface{}{Bold(Cyan(opSymbol + " ")), boldCode}, a...)...)
  19. fmt.Fprintln(os.Stdout, ResetCode)
  20. }
  21. func OperationInfo(a ...interface{}) {
  22. fmt.Fprint(os.Stdout, append([]interface{}{Bold(Cyan(opSymbol + " ")), boldCode}, a...)...)
  23. fmt.Fprint(os.Stdout, ResetCode)
  24. }
  25. func SprintOperationInfo(a ...interface{}) string {
  26. return fmt.Sprint(append([]interface{}{Bold(Cyan(opSymbol + " ")), boldCode}, a...)...) + ResetCode
  27. }
  28. func Info(a ...interface{}) {
  29. fmt.Fprint(os.Stdout, append([]interface{}{Bold(Green(arrow + " "))}, a...)...)
  30. }
  31. func Infoln(a ...interface{}) {
  32. fmt.Fprintln(os.Stdout, append([]interface{}{Bold(Green(arrow))}, a...)...)
  33. }
  34. func SprintWarn(a ...interface{}) string {
  35. return fmt.Sprint(append([]interface{}{Bold(yellow(smallArrow + " "))}, a...)...)
  36. }
  37. func Warn(a ...interface{}) {
  38. fmt.Fprint(os.Stdout, append([]interface{}{Bold(yellow(smallArrow + " "))}, a...)...)
  39. }
  40. func Warnln(a ...interface{}) {
  41. fmt.Fprintln(os.Stdout, append([]interface{}{Bold(yellow(smallArrow))}, a...)...)
  42. }
  43. func SprintError(a ...interface{}) string {
  44. return fmt.Sprint(append([]interface{}{Bold(Red(smallArrow + " "))}, a...)...)
  45. }
  46. func Error(a ...interface{}) {
  47. fmt.Fprint(os.Stderr, append([]interface{}{Bold(Red(smallArrow + " "))}, a...)...)
  48. }
  49. func Errorln(a ...interface{}) {
  50. fmt.Fprintln(os.Stderr, append([]interface{}{Bold(Red(smallArrow))}, a...)...)
  51. }
  52. func getColumnCount() int {
  53. if cachedColumnCount > 0 {
  54. return cachedColumnCount
  55. }
  56. if count, err := strconv.Atoi(os.Getenv("COLUMNS")); err == nil {
  57. cachedColumnCount = count
  58. return cachedColumnCount
  59. }
  60. if ws, err := unix.IoctlGetWinsize(syscall.Stdout, unix.TIOCGWINSZ); err == nil {
  61. cachedColumnCount = int(ws.Col)
  62. return cachedColumnCount
  63. }
  64. return 80
  65. }
  66. func PrintInfoValue(key string, values ...string) {
  67. // 16 (text) + 1 (:) + 1 ( )
  68. const (
  69. keyLength = 18
  70. delimCount = 2
  71. )
  72. str := fmt.Sprintf(Bold("%-16s: "), key)
  73. if len(values) == 0 || (len(values) == 1 && values[0] == "") {
  74. fmt.Fprintf(os.Stdout, "%s%s\n", str, gotext.Get("None"))
  75. return
  76. }
  77. maxCols := getColumnCount()
  78. cols := keyLength + len(values[0])
  79. str += values[0]
  80. for _, value := range values[1:] {
  81. if maxCols > keyLength && cols+len(value)+delimCount >= maxCols {
  82. cols = keyLength
  83. str += "\n" + strings.Repeat(" ", keyLength)
  84. } else if cols != keyLength {
  85. str += strings.Repeat(" ", delimCount)
  86. cols += delimCount
  87. }
  88. str += value
  89. cols += len(value)
  90. }
  91. fmt.Println(str)
  92. }