streamformatter.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package utils
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. )
  6. type StreamFormatter struct {
  7. json bool
  8. used bool
  9. }
  10. func NewStreamFormatter(json bool) *StreamFormatter {
  11. return &StreamFormatter{json, false}
  12. }
  13. func (sf *StreamFormatter) FormatStream(str string) []byte {
  14. sf.used = true
  15. if sf.json {
  16. b, err := json.Marshal(&JSONMessage{Stream: str})
  17. if err != nil {
  18. return sf.FormatError(err)
  19. }
  20. return b
  21. }
  22. return []byte(str + "\r")
  23. }
  24. func (sf *StreamFormatter) FormatStatus(id, format string, a ...interface{}) []byte {
  25. sf.used = true
  26. str := fmt.Sprintf(format, a...)
  27. if sf.json {
  28. b, err := json.Marshal(&JSONMessage{ID: id, Status: str})
  29. if err != nil {
  30. return sf.FormatError(err)
  31. }
  32. return b
  33. }
  34. return []byte(str + "\r\n")
  35. }
  36. func (sf *StreamFormatter) FormatError(err error) []byte {
  37. sf.used = true
  38. if sf.json {
  39. jsonError, ok := err.(*JSONError)
  40. if !ok {
  41. jsonError = &JSONError{Message: err.Error()}
  42. }
  43. if b, err := json.Marshal(&JSONMessage{Error: jsonError, ErrorMessage: err.Error()}); err == nil {
  44. return b
  45. }
  46. return []byte("{\"error\":\"format error\"}")
  47. }
  48. return []byte("Error: " + err.Error() + "\r\n")
  49. }
  50. func (sf *StreamFormatter) FormatProgress(id, action string, progress *JSONProgress) []byte {
  51. if progress == nil {
  52. progress = &JSONProgress{}
  53. }
  54. sf.used = true
  55. if sf.json {
  56. b, err := json.Marshal(&JSONMessage{
  57. Status: action,
  58. ProgressMessage: progress.String(),
  59. Progress: progress,
  60. ID: id,
  61. })
  62. if err != nil {
  63. return nil
  64. }
  65. return b
  66. }
  67. endl := "\r"
  68. if progress.String() == "" {
  69. endl += "\n"
  70. }
  71. return []byte(action + " " + progress.String() + endl)
  72. }
  73. func (sf *StreamFormatter) Used() bool {
  74. return sf.used
  75. }