io.go 917 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package interpol
  2. import (
  3. "bufio"
  4. "io"
  5. "unicode/utf8"
  6. )
  7. type runeWriter interface {
  8. io.Writer
  9. WriteRune(r rune) (int, error)
  10. }
  11. func templateReader(opts *Options) io.RuneReader {
  12. if rr, ok := opts.Template.(io.RuneReader); ok {
  13. return rr
  14. }
  15. return bufio.NewReaderSize(opts.Template, utf8.UTFMax)
  16. }
  17. func outputWriter(opts *Options) runeWriter {
  18. if rw, ok := opts.Output.(runeWriter); ok {
  19. return rw
  20. }
  21. return &simpleRuneWriter{w: opts.Output}
  22. }
  23. type simpleRuneWriter struct {
  24. runeEncoder
  25. w io.Writer
  26. }
  27. func (rw *simpleRuneWriter) Write(b []byte) (int, error) {
  28. return rw.w.Write(b)
  29. }
  30. func (rw *simpleRuneWriter) WriteRune(r rune) (int, error) {
  31. return rw.w.Write(rw.encode(r))
  32. }
  33. type runeEncoder struct {
  34. b [utf8.UTFMax]byte
  35. }
  36. func (re *runeEncoder) encode(r rune) []byte {
  37. if r < utf8.RuneSelf {
  38. re.b[0] = byte(r)
  39. return re.b[:1]
  40. }
  41. n := utf8.EncodeRune(re.b[:], r)
  42. return re.b[:n]
  43. }