resource.go 910 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package resource
  2. import (
  3. "io"
  4. "os"
  5. )
  6. // An Instance represents the content at some location accessed through some
  7. // Provider. It's the data at some URL.
  8. type Instance interface {
  9. Get() (io.ReadCloser, error)
  10. Put(io.Reader) error
  11. Stat() (os.FileInfo, error)
  12. io.ReaderAt
  13. WriteAt([]byte, int64) (int, error)
  14. Delete() error
  15. }
  16. type DirInstance interface {
  17. Readdirnames() ([]string, error)
  18. }
  19. // Creates a io.ReadSeeker to an Instance.
  20. func ReadSeeker(r Instance) io.ReadSeeker {
  21. fi, err := r.Stat()
  22. if err != nil {
  23. return nil
  24. }
  25. return io.NewSectionReader(r, 0, fi.Size())
  26. }
  27. // Move instance content, deleting the source if it succeeds.
  28. func Move(from, to Instance) (err error) {
  29. rc, err := from.Get()
  30. if err != nil {
  31. return
  32. }
  33. defer rc.Close()
  34. err = to.Put(rc)
  35. if err != nil {
  36. return
  37. }
  38. from.Delete()
  39. return
  40. }
  41. func Exists(i Instance) bool {
  42. _, err := i.Stat()
  43. return err == nil
  44. }