func formatURL()

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())
}