driver.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package driver
  2. import (
  3. "context"
  4. "github.com/IceWhaleTech/CasaOS/model"
  5. )
  6. type Driver interface {
  7. Meta
  8. Reader
  9. User
  10. //Writer
  11. //Other
  12. }
  13. type Meta interface {
  14. Config() Config
  15. // GetStorage just get raw storage, no need to implement, because model.Storage have implemented
  16. GetStorage() *model.StorageA
  17. SetStorage(model.StorageA)
  18. // GetAddition Additional is used for unmarshal of JSON, so need return pointer
  19. GetAddition() Additional
  20. // Init If already initialized, drop first
  21. Init(ctx context.Context) error
  22. Drop(ctx context.Context) error
  23. }
  24. type Other interface {
  25. Other(ctx context.Context, args model.OtherArgs) (interface{}, error)
  26. }
  27. type Reader interface {
  28. // List files in the path
  29. // if identify files by path, need to set ID with path,like path.Join(dir.GetID(), obj.GetName())
  30. // if identify files by id, need to set ID with corresponding id
  31. List(ctx context.Context, dir model.Obj, args model.ListArgs) ([]model.Obj, error)
  32. // Link get url/filepath/reader of file
  33. Link(ctx context.Context, file model.Obj, args model.LinkArgs) (*model.Link, error)
  34. }
  35. type User interface {
  36. // GetRoot get root directory of user
  37. GetUserInfo(ctx context.Context) (string, error)
  38. }
  39. type Getter interface {
  40. GetRoot(ctx context.Context) (model.Obj, error)
  41. }
  42. //type Writer interface {
  43. // Mkdir
  44. // Move
  45. // Rename
  46. // Copy
  47. // Remove
  48. // Put
  49. //}
  50. type Mkdir interface {
  51. MakeDir(ctx context.Context, parentDir model.Obj, dirName string) error
  52. }
  53. type Move interface {
  54. Move(ctx context.Context, srcObj, dstDir model.Obj) error
  55. }
  56. type Rename interface {
  57. Rename(ctx context.Context, srcObj model.Obj, newName string) error
  58. }
  59. type Copy interface {
  60. Copy(ctx context.Context, srcObj, dstDir model.Obj) error
  61. }
  62. type Remove interface {
  63. Remove(ctx context.Context, obj model.Obj) error
  64. }
  65. type Put interface {
  66. Put(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up UpdateProgress) error
  67. }
  68. //type WriteResult interface {
  69. // MkdirResult
  70. // MoveResult
  71. // RenameResult
  72. // CopyResult
  73. // PutResult
  74. // Remove
  75. //}
  76. type MkdirResult interface {
  77. MakeDir(ctx context.Context, parentDir model.Obj, dirName string) (model.Obj, error)
  78. }
  79. type MoveResult interface {
  80. Move(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj, error)
  81. }
  82. type RenameResult interface {
  83. Rename(ctx context.Context, srcObj model.Obj, newName string) (model.Obj, error)
  84. }
  85. type CopyResult interface {
  86. Copy(ctx context.Context, srcObj, dstDir model.Obj) (model.Obj, error)
  87. }
  88. type PutResult interface {
  89. Put(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up UpdateProgress) (model.Obj, error)
  90. }
  91. type UpdateProgress func(percentage int)
  92. type Progress struct {
  93. Total int64
  94. Done int64
  95. up UpdateProgress
  96. }
  97. func (p *Progress) Write(b []byte) (n int, err error) {
  98. n = len(b)
  99. p.Done += int64(n)
  100. p.up(int(float64(p.Done) / float64(p.Total) * 100))
  101. return
  102. }
  103. func NewProgress(total int64, up UpdateProgress) *Progress {
  104. return &Progress{
  105. Total: total,
  106. up: up,
  107. }
  108. }