github.com/sujit-baniya/migrate@v0.0.4/source/file/file.go (about)

     1  package file
     2  
     3  import (
     4  	nurl "net/url"
     5  	"os"
     6  	"path/filepath"
     7  
     8  	"github.com/sujit-baniya/migrate/source"
     9  	"github.com/sujit-baniya/migrate/source/iofs"
    10  )
    11  
    12  func init() {
    13  	source.Register("file", &File{})
    14  }
    15  
    16  type File struct {
    17  	iofs.PartialDriver
    18  	url  string
    19  	path string
    20  }
    21  
    22  func (f *File) Open(url string) (source.Driver, error) {
    23  	p, err := parseURL(url)
    24  	if err != nil {
    25  		return nil, err
    26  	}
    27  	nf := &File{
    28  		url:  url,
    29  		path: p,
    30  	}
    31  	if err := nf.Init(os.DirFS(p), "."); err != nil {
    32  		return nil, err
    33  	}
    34  	return nf, nil
    35  }
    36  
    37  func parseURL(url string) (string, error) {
    38  	u, err := nurl.Parse(url)
    39  	if err != nil {
    40  		return "", err
    41  	}
    42  	// concat host and path to restore full path
    43  	// host might be `.`
    44  	p := u.Opaque
    45  	if len(p) == 0 {
    46  		p = u.Host + u.Path
    47  	}
    48  
    49  	if len(p) == 0 {
    50  		// default to current directory if no path
    51  		wd, err := os.Getwd()
    52  		if err != nil {
    53  			return "", err
    54  		}
    55  		p = wd
    56  
    57  	} else if p[0:1] == "." || p[0:1] != "/" {
    58  		// make path absolute if relative
    59  		abs, err := filepath.Abs(p)
    60  		if err != nil {
    61  			return "", err
    62  		}
    63  		p = abs
    64  	}
    65  	return p, nil
    66  }