log.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package app
  2. import (
  3. "fmt"
  4. "runtime"
  5. "strings"
  6. )
  7. var (
  8. // DefaultLogger is the logger used to log info and errors.
  9. DefaultLogger func(format string, v ...any)
  10. defaultColor string
  11. errorColor string
  12. infoColor string
  13. )
  14. func init() {
  15. goarch := runtime.GOARCH
  16. if goarch == "wasm" {
  17. DefaultLogger = clientLog
  18. return
  19. }
  20. if goarch != "window" {
  21. defaultColor = "\033[00m"
  22. errorColor = "\033[91m"
  23. infoColor = "\033[94m"
  24. }
  25. DefaultLogger = serverLog
  26. }
  27. // Log logs using the default formats for its operands. Spaces are always added
  28. // between operands.
  29. func Log(v ...any) {
  30. var b strings.Builder
  31. for i := 0; i < len(v); i++ {
  32. if i != 0 {
  33. b.WriteByte(' ')
  34. }
  35. b.WriteString("%v")
  36. }
  37. Logf(b.String(), v...)
  38. }
  39. // Logf logs according to a format specifier.
  40. func Logf(format string, v ...any) {
  41. DefaultLogger(format, v...)
  42. }
  43. func serverLog(format string, v ...any) {
  44. errorLevel := false
  45. for _, a := range v {
  46. if _, ok := a.(error); ok {
  47. errorLevel = true
  48. break
  49. }
  50. }
  51. if errorLevel {
  52. fmt.Printf(errorColor+"ERROR ‣ "+defaultColor+format+"\n", v...)
  53. return
  54. }
  55. fmt.Printf(infoColor+"INFO ‣ "+defaultColor+format+"\n", v...)
  56. }
  57. func clientLog(format string, v ...any) {
  58. isErrorLevel := false
  59. for _, a := range v {
  60. if _, isErr := a.(error); isErr {
  61. isErrorLevel = true
  62. break
  63. }
  64. }
  65. if isErrorLevel {
  66. Window().Get("console").Call("error", fmt.Sprintf(format, v...))
  67. return
  68. }
  69. Window().Get("console").Call("log", fmt.Sprintf(format, v...))
  70. }