tracing/connstr/connection_string_parser.go (37 lines of code) (raw):
package connstr
import (
"fmt"
"net/url"
"regexp"
)
// Connection strings:
// * opentracing://jaeger
// * opentracing://datadog
// * opentracing://lightstep?access_token=12345
var errInvalidConnection = fmt.Errorf("invalid connection string")
// Parse parses a opentracing connection string into a driverName and options map.
func Parse(connectionString string) (driverName string, options map[string]string, err error) {
if connectionString == "" {
return "", nil, errInvalidConnection
}
URL, err := url.Parse(connectionString)
if err != nil {
return "", nil, errInvalidConnection
}
if URL.Scheme != "opentracing" {
return "", nil, errInvalidConnection
}
driverName = URL.Host
if driverName == "" {
return "", nil, errInvalidConnection
}
// Connection strings should not have a path
if URL.Path != "" {
return "", nil, errInvalidConnection
}
matched, err := regexp.MatchString("^[a-z0-9_]+$", driverName)
if err != nil || !matched {
return "", nil, errInvalidConnection
}
query := URL.Query()
driverName = URL.Host
options = make(map[string]string, len(query))
for k := range query {
options[k] = query.Get(k)
}
return driverName, options, nil
}