podman
66 строк · 1.6 Кб
1package sprig
2
3import (
4"fmt"
5"net/url"
6"reflect"
7)
8
9func dictGetOrEmpty(dict map[string]interface{}, key string) string {
10value, ok := dict[key]
11if !ok {
12return ""
13}
14tp := reflect.TypeOf(value).Kind()
15if tp != reflect.String {
16panic(fmt.Sprintf("unable to parse %s key, must be of type string, but %s found", key, tp.String()))
17}
18return reflect.ValueOf(value).String()
19}
20
21// parses given URL to return dict object
22func urlParse(v string) map[string]interface{} {
23dict := map[string]interface{}{}
24parsedURL, err := url.Parse(v)
25if err != nil {
26panic(fmt.Sprintf("unable to parse url: %s", err))
27}
28dict["scheme"] = parsedURL.Scheme
29dict["host"] = parsedURL.Host
30dict["hostname"] = parsedURL.Hostname()
31dict["path"] = parsedURL.Path
32dict["query"] = parsedURL.RawQuery
33dict["opaque"] = parsedURL.Opaque
34dict["fragment"] = parsedURL.Fragment
35if parsedURL.User != nil {
36dict["userinfo"] = parsedURL.User.String()
37} else {
38dict["userinfo"] = ""
39}
40
41return dict
42}
43
44// join given dict to URL string
45func urlJoin(d map[string]interface{}) string {
46resURL := url.URL{
47Scheme: dictGetOrEmpty(d, "scheme"),
48Host: dictGetOrEmpty(d, "host"),
49Path: dictGetOrEmpty(d, "path"),
50RawQuery: dictGetOrEmpty(d, "query"),
51Opaque: dictGetOrEmpty(d, "opaque"),
52Fragment: dictGetOrEmpty(d, "fragment"),
53}
54userinfo := dictGetOrEmpty(d, "userinfo")
55var user *url.Userinfo
56if userinfo != "" {
57tempURL, err := url.Parse(fmt.Sprintf("proto://%s@host", userinfo))
58if err != nil {
59panic(fmt.Sprintf("unable to parse userinfo in dict: %s", err))
60}
61user = tempURL.User
62}
63
64resURL.User = user
65return resURL.String()
66}
67