routes.go 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package internal
  2. import (
  3. "encoding/binary"
  4. "errors"
  5. "io"
  6. "io/ioutil"
  7. "time"
  8. )
  9. // Route is the value part of a shortcut.
  10. type Route struct {
  11. URL string `json:"url"`
  12. Time time.Time `json:"time"`
  13. }
  14. // RouteIterator allows iteration of the named routes in the store.
  15. type RouteIterator interface {
  16. Valid() bool
  17. Next() bool
  18. Seek(string) bool
  19. Error() error
  20. Name() string
  21. Route() *Route
  22. Release()
  23. }
  24. var ErrRouteNotFound = errors.New("route not found")
  25. // Serialize this Route into the given Writer.
  26. func (o *Route) Write(w io.Writer) error {
  27. if err := binary.Write(w, binary.LittleEndian, o.Time.UnixNano()); err != nil {
  28. return err
  29. }
  30. if _, err := w.Write([]byte(o.URL)); err != nil {
  31. return err
  32. }
  33. return nil
  34. }
  35. // Deserialize this Route from the given Reader.
  36. func (o *Route) Read(r io.Reader) error {
  37. var t int64
  38. if err := binary.Read(r, binary.LittleEndian, &t); err != nil {
  39. return err
  40. }
  41. b, err := ioutil.ReadAll(r)
  42. if err != nil {
  43. return err
  44. }
  45. o.URL = string(b)
  46. o.Time = time.Unix(0, t)
  47. return nil
  48. }