-
-
Notifications
You must be signed in to change notification settings - Fork 101
/
Copy pathimplementation.cpp
74 lines (66 loc) · 2.17 KB
/
implementation.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <string_view>
#include "ada.h"
#include "ada/common_defs.h"
#include "ada/parser.h"
#include "ada/url.h"
#include "ada/url_aggregator.h"
namespace ada {
template <class result_type>
ada_warn_unused tl::expected<result_type, ada::errors> parse(
std::string_view input, const result_type* base_url) {
result_type u = ada::parser::parse_url<result_type>(input, base_url);
if (!u.is_valid) {
return tl::unexpected(errors::generic_error);
}
return u;
}
template ada::result<url> parse<url>(std::string_view input,
const url* base_url = nullptr);
template ada::result<url_aggregator> parse<url_aggregator>(
std::string_view input, const url_aggregator* base_url = nullptr);
std::string href_from_file(std::string_view input) {
// This is going to be much faster than constructing a URL.
std::string tmp_buffer;
std::string_view internal_input;
if (unicode::has_tabs_or_newline(input)) {
tmp_buffer = helpers::get_ascii_tab_or_newline_removed(input);
internal_input = tmp_buffer;
} else {
internal_input = input;
}
std::string path;
if (internal_input.empty()) {
path = "/";
} else if ((internal_input[0] == '/') || (internal_input[0] == '\\')) {
helpers::parse_prepared_path(internal_input.substr(1),
ada::scheme::type::FILE, path);
} else {
helpers::parse_prepared_path(internal_input, ada::scheme::type::FILE, path);
}
return "file://" + path;
}
bool can_parse(std::string_view input, const std::string_view* base_input) {
ada::result<ada::url_aggregator> base;
ada::url_aggregator* base_pointer = nullptr;
if (base_input != nullptr) {
base = ada::parse<url_aggregator>(*base_input);
if (!base) {
return false;
}
base_pointer = &base.value();
}
return ada::parse<url_aggregator>(input, base_pointer).has_value();
}
ada_warn_unused std::string to_string(ada::encoding_type type) {
switch (type) {
case ada::encoding_type::UTF8:
return "UTF-8";
case ada::encoding_type::UTF_16LE:
return "UTF-16LE";
case ada::encoding_type::UTF_16BE:
return "UTF-16BE";
default:
unreachable();
}
}
} // namespace ada