2
2
mirror of https://github.com/octoleo/restic.git synced 2024-11-05 04:47:51 +00:00
restic/location/location.go

67 lines
1.6 KiB
Go
Raw Normal View History

2015-12-28 14:57:20 +00:00
// Package location implements parsing the restic repository location from a string.
package location
2015-12-28 14:51:24 +00:00
import (
"strings"
"github.com/restic/restic/backend/local"
"github.com/restic/restic/backend/s3"
"github.com/restic/restic/backend/sftp"
)
2015-12-28 14:57:20 +00:00
// Location specifies the location of a repository, including the method of
// access and (possibly) credentials needed for access.
type Location struct {
2015-12-28 14:51:24 +00:00
Scheme string
Config interface{}
}
type parser struct {
scheme string
parse func(string) (interface{}, error)
}
// parsers is a list of valid config parsers for the backends. The first parser
// is the fallback and should always be set to the local backend.
var parsers = []parser{
{"local", local.ParseConfig},
{"sftp", sftp.ParseConfig},
{"s3", s3.ParseConfig},
}
2015-12-28 14:57:20 +00:00
// ParseLocation parses a repository location from the string s. If s starts with a
2015-12-28 14:51:24 +00:00
// backend name followed by a colon, that backend's Parse() function is called.
// Otherwise, the local backend is used which interprets s as the name of a
// directory.
2015-12-28 14:57:20 +00:00
func ParseLocation(s string) (u Location, err error) {
2015-12-28 14:51:24 +00:00
scheme := extractScheme(s)
u.Scheme = scheme
for _, parser := range parsers {
if parser.scheme != scheme {
continue
}
u.Config, err = parser.parse(s)
if err != nil {
2015-12-28 14:57:20 +00:00
return Location{}, err
2015-12-28 14:51:24 +00:00
}
return u, nil
}
// try again, with the local parser and the prefix "local:"
u.Scheme = "local"
u.Config, err = local.ParseConfig("local:" + s)
if err != nil {
2015-12-28 14:57:20 +00:00
return Location{}, err
2015-12-28 14:51:24 +00:00
}
return u, nil
}
func extractScheme(s string) string {
data := strings.SplitN(s, ":", 2)
return data[0]
}