jsonlog_marshalling.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. // This code was initially generated by ffjson <https://github.com/pquerna/ffjson>
  2. // This code was generated via the following steps:
  3. // $ go get -u github.com/pquerna/ffjson
  4. // $ make BIND_DIR=. shell
  5. // $ ffjson pkg/jsonlog/jsonlog.go
  6. // $ mv pkg/jsonglog/jsonlog_ffjson.go pkg/jsonlog/jsonlog_marshalling.go
  7. //
  8. // It has been modified to improve the performance of time marshalling to JSON
  9. // and to clean it up.
  10. // Should this code need to be regenerated when the JSONLog struct is changed,
  11. // the relevant changes which have been made are:
  12. // import (
  13. // "bytes"
  14. //-
  15. // "unicode/utf8"
  16. // )
  17. //
  18. // func (mj *JSONLog) MarshalJSON() ([]byte, error) {
  19. //@@ -20,13 +16,13 @@ func (mj *JSONLog) MarshalJSON() ([]byte, error) {
  20. // }
  21. // return buf.Bytes(), nil
  22. // }
  23. //+
  24. // func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error {
  25. //- var err error
  26. //- var obj []byte
  27. //- var first bool = true
  28. //- _ = obj
  29. //- _ = err
  30. //- _ = first
  31. //+ var (
  32. //+ err error
  33. //+ timestamp string
  34. //+ first bool = true
  35. //+ )
  36. // buf.WriteString(`{`)
  37. // if len(mj.Log) != 0 {
  38. // if first == true {
  39. //@@ -52,11 +48,11 @@ func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error {
  40. // buf.WriteString(`,`)
  41. // }
  42. // buf.WriteString(`"time":`)
  43. //- obj, err = mj.Created.MarshalJSON()
  44. //+ timestamp, err = FastTimeMarshalJSON(mj.Created)
  45. // if err != nil {
  46. // return err
  47. // }
  48. //- buf.Write(obj)
  49. //+ buf.WriteString(timestamp)
  50. // buf.WriteString(`}`)
  51. // return nil
  52. // }
  53. // @@ -81,9 +81,10 @@ func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error {
  54. // if len(mj.Log) != 0 {
  55. // - if first == true {
  56. // - first = false
  57. // - } else {
  58. // - buf.WriteString(`,`)
  59. // - }
  60. // + first = false
  61. // buf.WriteString(`"log":`)
  62. // ffjsonWriteJSONString(buf, mj.Log)
  63. // }
  64. package jsonlog
  65. import (
  66. "bytes"
  67. "unicode/utf8"
  68. )
  69. // MarshalJSON marshals the JSONLog.
  70. func (mj *JSONLog) MarshalJSON() ([]byte, error) {
  71. var buf bytes.Buffer
  72. buf.Grow(1024)
  73. if err := mj.MarshalJSONBuf(&buf); err != nil {
  74. return nil, err
  75. }
  76. return buf.Bytes(), nil
  77. }
  78. // MarshalJSONBuf marshals the JSONLog and stores the result to a bytes.Buffer.
  79. func (mj *JSONLog) MarshalJSONBuf(buf *bytes.Buffer) error {
  80. var (
  81. err error
  82. timestamp string
  83. first = true
  84. )
  85. buf.WriteString(`{`)
  86. if len(mj.Log) != 0 {
  87. first = false
  88. buf.WriteString(`"log":`)
  89. ffjsonWriteJSONString(buf, mj.Log)
  90. }
  91. if len(mj.Stream) != 0 {
  92. if first {
  93. first = false
  94. } else {
  95. buf.WriteString(`,`)
  96. }
  97. buf.WriteString(`"stream":`)
  98. ffjsonWriteJSONString(buf, mj.Stream)
  99. }
  100. if !first {
  101. buf.WriteString(`,`)
  102. }
  103. buf.WriteString(`"time":`)
  104. timestamp, err = FastTimeMarshalJSON(mj.Created)
  105. if err != nil {
  106. return err
  107. }
  108. buf.WriteString(timestamp)
  109. buf.WriteString(`}`)
  110. return nil
  111. }
  112. func ffjsonWriteJSONString(buf *bytes.Buffer, s string) {
  113. const hex = "0123456789abcdef"
  114. buf.WriteByte('"')
  115. start := 0
  116. for i := 0; i < len(s); {
  117. if b := s[i]; b < utf8.RuneSelf {
  118. if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' {
  119. i++
  120. continue
  121. }
  122. if start < i {
  123. buf.WriteString(s[start:i])
  124. }
  125. switch b {
  126. case '\\', '"':
  127. buf.WriteByte('\\')
  128. buf.WriteByte(b)
  129. case '\n':
  130. buf.WriteByte('\\')
  131. buf.WriteByte('n')
  132. case '\r':
  133. buf.WriteByte('\\')
  134. buf.WriteByte('r')
  135. default:
  136. buf.WriteString(`\u00`)
  137. buf.WriteByte(hex[b>>4])
  138. buf.WriteByte(hex[b&0xF])
  139. }
  140. i++
  141. start = i
  142. continue
  143. }
  144. c, size := utf8.DecodeRuneInString(s[i:])
  145. if c == utf8.RuneError && size == 1 {
  146. if start < i {
  147. buf.WriteString(s[start:i])
  148. }
  149. buf.WriteString(`\ufffd`)
  150. i += size
  151. start = i
  152. continue
  153. }
  154. if c == '\u2028' || c == '\u2029' {
  155. if start < i {
  156. buf.WriteString(s[start:i])
  157. }
  158. buf.WriteString(`\u202`)
  159. buf.WriteByte(hex[c&0xF])
  160. i += size
  161. start = i
  162. continue
  163. }
  164. i += size
  165. }
  166. if start < len(s) {
  167. buf.WriteString(s[start:])
  168. }
  169. buf.WriteByte('"')
  170. }