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  }