podman
66 строк · 1.6 Кб
1package sprig2
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.Scheme29dict["host"] = parsedURL.Host30dict["hostname"] = parsedURL.Hostname()31dict["path"] = parsedURL.Path32dict["query"] = parsedURL.RawQuery33dict["opaque"] = parsedURL.Opaque34dict["fragment"] = parsedURL.Fragment35if parsedURL.User != nil {36dict["userinfo"] = parsedURL.User.String()37} else {38dict["userinfo"] = ""39}40
41return dict42}
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.Userinfo56if 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.User62}63
64resURL.User = user65return resURL.String()66}
67