11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
21PROMEKI_NAMESPACE_BEGIN
75 PROMEKI_DATATYPE(Url, DataTypeUrl, 1)
78 Error writeToStream(DataStream &s) const;
80 template <uint32_t V> static Result<Url> readFromStream(DataStream &s);
83 static constexpr
int PortUnset = -1;
100 static Result<Url> fromString(const String &s);
116 static String percentEncode(const String &s, const
char *safe =
nullptr);
125 static String percentDecode(const String &s, Error *err =
nullptr);
140 explicit Url(const String &s) : Url(fromString(s).first()) {}
143 explicit Url(
const char *s) : Url(fromString(String(s)).first()) {}
151 bool isValid()
const {
return !_scheme.isEmpty(); }
154 const String &scheme()
const {
return _scheme; }
157 const String &userInfo()
const {
return _userInfo; }
165 const String &host()
const {
return _host; }
170 int port()
const {
return _port; }
173 const String &path()
const {
return _path; }
184 const Map<String, String> &query()
const {
return _query; }
195 String queryValue(
const String &key,
const String &defaultValue = String())
const {
196 return _query.value(key, defaultValue);
204 bool hasQueryValue(
const String &key)
const {
return _query.contains(key); }
207 const String &fragment()
const {
return _fragment; }
218 bool hasAuthority()
const {
return _hasAuthority; }
221 Url &setScheme(
const String &s);
224 Url &setUserInfo(
const String &s) {
235 Url &setHost(
const String &s);
238 Url &setPort(
int p) {
244 Url &setPath(
const String &s) {
250 Url &setQuery(
const Map<String, String> &q) {
256 Url &setQueryValue(
const String &key,
const String &value) {
257 _query.insert(key, value);
262 Url &removeQueryValue(
const String &key) {
268 Url &setFragment(
const String &s) {
282 Url &setHasAuthority(
bool v) {
295 String toString()
const;
316 String redactedString()
const;
319 bool operator==(
const Url &other)
const;
322 bool operator!=(
const Url &other)
const {
return !(*
this == other); }
328 int _port = PortUnset;
330 Map<String, String> _query;
332 bool _hasAuthority =
false;
337PROMEKI_FORMAT_VIA_TOSTRING(promeki::Url);