in lib/http.go [998:1056]
func formatURL(arg ref.Val) ref.Val {
urlMap, ok := arg.(traits.Mapper)
if !ok {
return types.ValOrErr(urlMap, "no such overload")
}
v, err := urlMap.ConvertToNative(reflectMapStringAnyType)
if err != nil {
return types.NewErr("no such overload for format_url: %v", err)
}
m, ok := v.(map[string]interface{})
if !ok {
// This should never happen.
return types.NewErr("unexpected type for url map: %T", v)
}
u := url.URL{
Scheme: maybeStringLookup(m, "Scheme"),
Opaque: maybeStringLookup(m, "Opaque"),
Host: maybeStringLookup(m, "Host"),
Path: maybeStringLookup(m, "Path"),
RawPath: maybeStringLookup(m, "RawPath"),
ForceQuery: maybeBoolLookup(m, "ForceQuery"),
RawQuery: maybeStringLookup(m, "RawQuery"),
Fragment: maybeStringLookup(m, "Fragment"),
RawFragment: maybeStringLookup(m, "RawFragment"),
}
user, ok := urlMap.Find(types.String("User"))
if ok {
switch user := user.(type) {
case nil:
case traits.Mapper:
var username types.String
un, ok := user.Find(types.String("Username"))
if ok {
username, ok = un.(types.String)
if !ok {
return types.NewErr("invalid type for username: %s", un.Type())
}
}
if user.Get(types.String("PasswordSet")) == types.True {
var password types.String
pw, ok := user.Find(types.String("Password"))
if ok {
password, ok = pw.(types.String)
if !ok {
return types.NewErr("invalid type for password: %s", pw.Type())
}
}
u.User = url.UserPassword(string(username), string(password))
} else {
u.User = url.User(string(username))
}
default:
if user != types.NullValue {
return types.NewErr("unsupported type: %T", user)
}
}
}
return types.String(u.String())
}