github.com/goravel/framework@v1.13.9/filesystem/application.go (about) 1 package filesystem 2 3 import ( 4 "fmt" 5 6 "github.com/gookit/color" 7 8 "github.com/goravel/framework/contracts/config" 9 "github.com/goravel/framework/contracts/filesystem" 10 ) 11 12 type Driver string 13 14 const ( 15 DriverLocal Driver = "local" 16 DriverCustom Driver = "custom" 17 ) 18 19 type Storage struct { 20 filesystem.Driver 21 config config.Config 22 drivers map[string]filesystem.Driver 23 } 24 25 func NewStorage(config config.Config) *Storage { 26 defaultDisk := config.GetString("filesystems.default") 27 if defaultDisk == "" { 28 color.Redln("[filesystem] please set default disk") 29 30 return nil 31 } 32 33 driver, err := NewDriver(config, defaultDisk) 34 if err != nil { 35 color.Redf("[filesystem] %s\n", err) 36 37 return nil 38 } 39 40 drivers := make(map[string]filesystem.Driver) 41 drivers[defaultDisk] = driver 42 return &Storage{ 43 Driver: driver, 44 config: config, 45 drivers: drivers, 46 } 47 } 48 49 func NewDriver(config config.Config, disk string) (filesystem.Driver, error) { 50 driver := Driver(config.GetString(fmt.Sprintf("filesystems.disks.%s.driver", disk))) 51 switch driver { 52 case DriverLocal: 53 return NewLocal(config, disk) 54 case DriverCustom: 55 driver, ok := config.Get(fmt.Sprintf("filesystems.disks.%s.via", disk)).(filesystem.Driver) 56 if ok { 57 return driver, nil 58 } 59 60 driverCallback, ok := config.Get(fmt.Sprintf("filesystems.disks.%s.via", disk)).(func() (filesystem.Driver, error)) 61 if ok { 62 return driverCallback() 63 } 64 65 return nil, fmt.Errorf("init %s disk fail: via must be implement filesystem.Driver or func() (filesystem.Driver, error)", disk) 66 } 67 68 return nil, fmt.Errorf("invalid driver: %s, only support local, custom", driver) 69 } 70 71 func (r *Storage) Disk(disk string) filesystem.Driver { 72 if driver, exist := r.drivers[disk]; exist { 73 return driver 74 } 75 76 driver, err := NewDriver(r.config, disk) 77 if err != nil { 78 panic(err) 79 } 80 81 r.drivers[disk] = driver 82 83 return driver 84 }