{"id":301991,"date":"2020-04-16T15:00:48","date_gmt":"2020-04-16T15:00:48","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=301991"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=301991","title":{"rendered":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0443\u043f\u0430\u0440\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u043d\u043e\u0433\u043e\u044d\u0442\u0430\u0436\u043d\u044b\u043c\u0438 \u0421++\u043d\u044b\u043c\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u0432 RESTinio: \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 express-js \u0440\u043e\u0443\u0442\u0435\u0440\u0443"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/497508\/\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bh\/ei\/td\/bheitd3ichxc6a_l2tu_npnbvag.png\"><\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/github.com\/Stiffstream\/restinio\" rel=\"nofollow\">RESTinio<\/a>, \u043d\u0430\u0448 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0439 HTTP-\u0441\u0435\u0440\u0432\u0435\u0440, <a href=\"https:\/\/stiffstream.com\/ru\/news\/2020\/4\/restinio_0_6_6_released.html\" rel=\"nofollow\">\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f<\/a>. \u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 RESTinio \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0432 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u0435\u0439\u0448\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e\u044d\u0442\u0430\u0436\u043d\u044b\u0435 C++\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b (\u043e \u0447\u0435\u043c \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u043d\u0435\u0435: <a href=\"https:\/\/habr.com\/ru\/post\/345788\/\">1<\/a>, <a href=\"https:\/\/habr.com\/ru\/post\/456632\/\">2<\/a>).<\/p>\n<p>  <\/p>\n<p>C++\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0432 RESTinio \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u044b \u043d\u0435 \u0440\u0430\u0434\u0438 \u043b\u044e\u0431\u0432\u0438 \u043a \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0443, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0446\u0435\u043b\u0438, \u043f\u0440\u0435\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u0443\u044e \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 RESTinio: \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u0433\u0438\u0431\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0431\u044b \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0430 \u043b\u0443\u0447\u0448\u0435 \u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c) \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0433\u043b\u0443\u043f\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a, \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u043b\u0438\u0448\u044c \u0432 run-time. \u041a\u0430\u043a \u0440\u0430\u0437 \u043e\u0431 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u043c \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0432 RESTinio, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438 \u0441\u043b\u0443\u0436\u0438\u0442 \u0446\u0435\u043b\u0438 \u0437\u0430\u0449\u0438\u0442\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u0442 \u043d\u0435\u043f\u0440\u0435\u0434\u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043e\u043f\u0435\u0447\u0430\u0442\u043e\u043a, \u0438 \u043f\u043e\u0439\u0434\u0435\u0442 \u0440\u0435\u0447\u044c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u0410 \u0442\u0430\u043a\u0436\u0435 \u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0435\u0442\u0430\u043b\u044f\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0442\u0435\u0445, <s>\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0442\u0435\u043c\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0441\u0438\u043b\u044b<\/s> \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<h1 id=\"easy_parser_router-kak-alternativa-express-router-u\">easy_parser_router \u043a\u0430\u043a \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 express-router-\u0443<\/h1>\n<p>  <\/p>\n<h2 id=\"express-router-i-chto-s-nim-ne-tak\">express-router \u0438 \u0447\u0442\u043e \u0441 \u043d\u0438\u043c \u043d\u0435 \u0442\u0430\u043a?<\/h2>\n<p>  <\/p>\n<p>\u0420\u043e\u0443\u0442\u0435\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e <a href=\"https:\/\/expressjs.com\/\" rel=\"nofollow\">ExpressJS<\/a> \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 RESTinio \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0430\u0432\u043d\u043e, \u043f\u0430\u0440\u0443 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434. \u0428\u0442\u0443\u043a\u0430 \u044d\u0442\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u0430\u044f, \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u0430\u044f \u043c\u043d\u043e\u0433\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043e\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0438 \u0448\u0438\u0440\u043e\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u0430\u044f. \u041d\u043e, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0430\u044f \u0438\u0437 \u043c\u0438\u0440\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438-\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432. \u0418, \u043f\u043e\u0441\u0435\u043c\u0443, \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0432\u0448\u0430\u044f \u0440\u044f\u0434 \u043f\u0440\u0438\u0441\u0443\u0449\u0438\u0445 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0435 \u0440\u043e\u0434\u043e\u0432\u044b\u0445 \u0442\u0440\u0430\u0432\u043c.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h3 id=\"podverzhennost-oshibkam-i-opechatkam\">\u041f\u043e\u0434\u0432\u0435\u0440\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0430\u043c \u0438 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0430\u043c<\/h3>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 express-\u0440\u043e\u0443\u0442\u0435\u0440\u043e\u043c \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u0440\u043e\u0432\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u0412\u043e\u0437\u044c\u043c\u0435\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a\u043e\u0439 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">router-&gt;http_get(&quot;\/api\/v1\/books\/:id&quot;,    [](const auto &amp; req, auto params) {       const auto book_id = restinio::cast_to&lt;std::uint64_t&gt;(params[&quot;Id&quot;]);       ...    });<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u0440\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u0432 \u0433\u043b\u0430\u0437\u0430, \u044d\u0442\u043e \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0430 \u0432 \u0438\u043c\u0435\u043d\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 &quot;id&quot;. \u0412 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0435 \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0438\u043c\u0435\u043d\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a &quot;id&quot; (\u0432\u0441\u0435 \u0431\u0443\u043a\u0432\u044b \u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0435), \u0430 \u043f\u0440\u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u044f &quot;Id&quot; (\u043f\u0435\u0440\u0432\u0430\u044f \u0431\u0443\u043a\u0432\u0430 \u043f\u0440\u043e\u043f\u0438\u0441\u043d\u0430\u044f).<\/p>\n<p>  <\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u2014 \u044d\u0442\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 id. \u0412\u043e\u0442 \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 <code>\/api\/v1\/books\/:id<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 &quot;id&quot; \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u043e \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e, \u0445\u043e\u0442\u044c \u0447\u0438\u0441\u043b\u043e, \u0445\u043e\u0442\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u0445\u043e\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0443\u0436\u043d\u043e \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">router-&gt;http_get(R&quot;(\/api\/v1\/books\/:id(\\d+))&quot;,    [](const auto &amp; req, auto params) {       const auto book_id = restinio::cast_to&lt;std::uint64_t&gt;(params[&quot;id&quot;]);       ...    });<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u0438 \u0437\u0434\u0435\u0441\u044c \u0435\u0449\u0435 \u043d\u0435 \u0432\u0441\u0435, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e.<\/p>\n<p>  <\/p>\n<p>\u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 &quot;id&quot; \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0439\u0442\u0438 \u043e\u0447\u0435\u043d\u044c \u0434\u043b\u0438\u043d\u043d\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u0437 \u0446\u0438\u0444\u0440, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 64-\u0431\u0438\u0442\u043e\u0432\u043e\u0433\u043e \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0433\u043e \u0446\u0435\u043b\u043e\u0433\u043e.<\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430\u044f \u043f\u0440\u0430\u0432\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">router-&gt;http_get(R&quot;(\/api\/v1\/books\/:id(\\d{1,10}))&quot;,    [](const auto &amp; req, auto params) {       const auto book_id = restinio::cast_to&lt;std::uint64_t&gt;(params[&quot;id&quot;]);       ...    });<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u043f\u043b\u043e\u0445\u043e\u0435 \u0432 \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u043c \u0442\u043e, \u0447\u0442\u043e \u0432\u0441\u0435 \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 run-time. \u0422.\u0435., \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u0432\u043e\u0439 \u043a\u043e\u0434, \u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c \u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u043e\u0431\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u0441\u0442\u0432.<\/p>\n<p>  <\/p>\n<h3 id=\"otsutstvie-prozrachnosti-i-bezopasnosti-po-tipam\">\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u0442\u0438\u043f\u0430\u043c<\/h3>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0435\u0431\u0435, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">class api_v1_handler {    ... public:    auto on_get_book(          const restinio::request_handle_t &amp; req,          restinio::router::route_params_t params)    {       const auto book_id = restinio::cast_to&lt;std::uint64_t&gt;(params[&quot;id&quot;]);       ...    }     auto on_get_book_version(          const restinio::request_handle_t &amp; req,          restinio::router::route_params_t params)    {       const auto book_id = restinio::cast_to&lt;std::uint64_t&gt;(params[&quot;id&quot;]);       const auto ver_id = restinio::cast_to&lt;std::string&gt;(params[&quot;version&quot;]);       ...    }     auto on_get_author_books(          const restinio::request_handle_t &amp; req,          restinio::router::route_params_t params)    {       const auto author = restinio::cast_to&lt;std::string&gt;(params[&quot;author&quot;]);       ...    }    ... };<\/code><\/pre>\n<p>  <\/p>\n<p>\u0423 \u0432\u0441\u0435\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b \u0438 \u043d\u0435 \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u044f \u0432 \u0442\u0435\u043b\u043e \u043c\u0435\u0442\u043e\u0434\u0430-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0432 \u043a\u0430\u043a\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u0442 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a.<\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">auto handler = std::make_shared&lt;api_v1_handler&gt;(...); router-&gt;http_get(R&quot;(\/api\/v1\/books\/:id(\\d{1,10}))&quot;,    [handler](const auto &amp; req, auto params) {       return handler-&gt;on_get_book_version(req, params);    }); router-&gt;http_get(R&quot;(\/api\/v1\/books\/:id(\\d{1,10})\/versions\/:version)&quot;,    [handler](const auto &amp; req, auto params) {       return handler-&gt;on_get_author_books(req, params);    }); router-&gt;http_get(R&quot;(\/api\/v1\/:author)&quot;,    [handler](const auto &amp; req, auto params) {       return handler-&gt;on_get_book(req, params);    });<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u043f\u044f\u0442\u044c \u0436\u0435 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443, \u043f\u043e \u0441\u0443\u0442\u0438, \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043d\u0435\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0413\u043b\u044f\u0434\u044f \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043c \u0432\u043d\u0443\u0442\u0440\u0438 \u0438 \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043c\u0443 \u0438\u043b\u0438 \u0438\u043d\u043e\u043c\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 <code>api_v1_handler<\/code>. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 express-\u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">class api_v1_handler {    ...    auto on_get_book_version(          const restinio::request_handle_t &amp; req,          std::uint64_t book_id,          const std::string &amp; ver_id) { ... }    ... };  auto handler = std::make_shared&lt;api_v1_handler&gt;(...); router-&gt;http_get(R&quot;(\/api\/v1\/books\/:id(\\d{1,10})\/versions\/:version)&quot;,    [handler](const auto &amp; req, auto params) {       return handler-&gt;on_get_book_version(req,             restinio::cast_to&lt;std::uint64_t&gt;(params[&quot;id&quot;]),             restinio::cast_to&lt;std::string&gt;(params[&quot;version&quot;]));    });<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0447\u0430\u0441\u0442\u0438 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c. \u041d\u043e \u043f\u043b\u043e\u0445\u043e \u0437\u0434\u0435\u0441\u044c \u0442\u043e, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a <em>\u043c\u043e\u0436\u0435\u0442<\/em> \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a. \u0410 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c. \u0418, \u0447\u0442\u043e \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u043e, \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u043d\u0435 \u043f\u0438\u0448\u0435\u0442. <\/p>\n<p>  <\/p>\n<h2 id=\"easy_parser_router-v-kachestve-alternativy\">easy_parser_router \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b<\/h2>\n<p>  <\/p>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0432\u0435\u0440\u0441\u0438\u0438 0.6.6 \u0432 RESTinio \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 express-\u0440\u043e\u0443\u0442\u0435\u0440\u0443 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <em>easy_parser_router<\/em> \u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a easy_parser_router \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b.<\/p>\n<p>  <\/p>\n<p>\u0421\u043f\u0435\u0440\u0432\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c &quot;id&quot;:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">namespace epr = restinio::router::easy_parser_router; router-&gt;http_get(    epr::path_to_params(       &quot;\/api\/v1\/books\/&quot;,       epr::non_negative_decimal_number_p&lt;std::uint64_t&gt;()),    [](const auto &amp; req, std::uint64_t book_id) {       ...    });<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043c\u0430\u0440\u0448\u0440\u0443\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a HTTP GET \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438 <code>api\/v1\/books\/<\/code> \u0438 \u043d\u0435\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e 64-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043f\u0435\u0440\u0432\u044b\u0439 \u2014 \u044d\u0442\u043e \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <code>restinio::request_handle_t<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0441\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432;<\/li>\n<li>\u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u044d\u0442\u043e \u0442\u043e \u0441\u0430\u043c\u043e\u0435 64-\u0431\u0438\u0442\u043e\u0432\u043e\u0435 \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438\u0433\u0440\u0430\u0435\u0442 \u0440\u043e\u043b\u044c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u0447\u0435\u043c \u0442\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0435\u0449\u0435 \u0438 \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432 URL \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 book_id \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043b\u0438\u043d\u043d\u0430\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0446\u0438\u0444\u0440, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043a <code>uint64_t<\/code>, \u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 &quot;\u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442&quot; \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432\u044b\u0437\u0432\u0430\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c <code>api_v1_handler<\/code> \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u0435\u043c\u043d\u0435\u0435. \u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 <code>api_v1_handler<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">class api_v1_handler {    ... public:    using book_id_type = std::uint64_t;     auto on_get_book(          const restinio::request_handle_t &amp; req,          book_id_type book_id) { ... }     auto on_get_book_version(          const restinio::request_handle_t &amp; req,          book_id_type book_id,          const std::string &amp; ver_id) { ... }     auto on_get_author_books(          const restinio::request_handle_t &amp; req,          const std::string &amp; author) { ... }    ... };<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0440\u0430\u0437\u0443 \u043f\u043e \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u0432-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043c\u043e\u0436\u0435\u043c \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0443\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u0442\u044c \u0432 \u0442\u0435\u043b\u043e \u043c\u0435\u0442\u043e\u0434\u0430-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430.<\/p>\n<p>  <\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432 \u0438 \u0432\u044b\u0437\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">namespace epr = restinio::router::easy_parser_router;  auto book_id_p = epr::non_negative_decimal_number_p&lt;api_v1_handler::book_id_type&gt;(); auto ver_id_p = epr::path_fragment_p(); auto author_p = epr::path_fragment_p();  auto handler = std::make_shared&lt;api_v1_handler&gt;(...); router-&gt;http_get(    epr::path_to_params(&quot;\/api\/v1\/books\/&quot;, book_id_p),    [handler](const auto &amp; req, auto book_id) {       return handler-&gt;on_get_book(req, book_id);    }); router-&gt;http_get(    epr::path_to_params(&quot;\/api\/v1\/books\/&quot;, book_id_p, &quot;\/versions\/&quot;, ver_id_p),    [handler](const auto &amp; req, auto book_id, const auto &amp; ver_id) {       return handler-&gt;on_get_book_version(req, book_id, ver_id);    }); router-&gt;http_get(    epr::path_to_params(&quot;\/api\/v1\/&quot;, author_p),    [handler](const auto &amp; req, const auto &amp; author) {       return handler-&gt;on_get_author_books(req, author);    });<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>on_get_book<\/code> \u0442\u0430\u043c, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f <code>on_get_author_books<\/code>.<\/p>\n<p>  <\/p>\n<h3 id=\"ves-fokus-v-path_to_params-ili-v-path_to_tuple\">\u0412\u0435\u0441\u044c \u0444\u043e\u043a\u0443\u0441 \u0432 path_to_params. \u0418\u043b\u0438 \u0432 path_to_tuple<\/h3>\n<p>  <\/p>\n<p>\u0412\u0441\u044f \u043c\u0430\u0433\u0438\u044f, \u043a\u0430\u0441\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u043d\u043e\u0432\u043e\u0433\u043e easy_parser_router-\u0430, \u0441\u043a\u0440\u044b\u0442\u0430 \u0432\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>path_to_params<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b\u0438 \u0432\u044b\u0448\u0435. \u042d\u0442\u043e variadic template \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043b\u0438\u0431\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b, \u043b\u0438\u0431\u043e \u0442.\u043d. <em>producer<\/em>-\u044b.<\/p>\n<p>  <\/p>\n<p>\u0418\u0437 \u0441\u0432\u043e\u0438\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 <code>path_to_params<\/code> \u0441\u0442\u0440\u043e\u0438\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442-\u043f\u0430\u0440\u0441\u0435\u0440. \u042d\u0442\u043e\u0442 \u043f\u0430\u0440\u0441\u0435\u0440 \u0437\u043d\u0430\u0435\u0442, \u043a\u0430\u043a \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 path \u0438\u0437 URL, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0448\u0435\u043b \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0439 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 URL \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 path \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0422\u0430\u043a, \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0432 <code>path_to_params<\/code> \u043e\u0431\u044a\u0435\u043a\u0442-producer \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0441\u0442\u0440\u043e\u0433\u043e \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0432 <code>path_to_params<\/code> \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043e\u0434\u0438\u043d producer, \u0442\u043e \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043e \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u0434\u0432\u0430 producer-\u0430, \u0442\u043e \u0434\u0432\u0430. \u0415\u0441\u043b\u0438 \u0442\u0440\u0438, \u0442\u043e \u0442\u0440\u0438. \u0418 \u0442.\u0434. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0432 <code>path_to_params<\/code> \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e producer-\u0430, \u0430 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">router-&gt;http_get(epr::path_to_params(&quot;\/&quot;), [](const auto &amp; req) {...});<\/code><\/pre>\n<p>  <\/p>\n<p>\u0442\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043f\u0435\u0440\u0432\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0440\u0435\u0448\u0430\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u043d\u044b\u0439 <code>path_to_params<\/code> \u043e\u0431\u044a\u0435\u043a\u0442 \u2014 \u044d\u0442\u043e \u0440\u0430\u0437\u0431\u043e\u0440 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a \u0438\u0437 URL \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0443\u0436\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0436\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u043d\u043e\u0433\u043e <code>path_to_params<\/code> \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u2014 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0422.\u0435., \u0435\u0441\u043b\u0438 \u0432 <code>path_to_params<\/code> \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043e \u0434\u0432\u0430 producer-\u0430, \u0432\u043e\u0442 \u043a\u0430\u043a \u0442\u0443\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">router-&gt;http_get(    epr::path_to_params(&quot;\/api\/v1\/books\/&quot;, book_id_p, &quot;\/versions\/&quot;, ver_id_p),    [handler](const auto &amp; req, auto book_id, const auto &amp; ver_id) {       return handler-&gt;on_get_book_version(req, book_id, ver_id);    });<\/code><\/pre>\n<p>  <\/p>\n<p>\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u044d\u0442\u0438\u043c\u0438 producer-\u0430\u043c\u0438, \u043f\u043e\u0439\u0434\u0443\u0442 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043a\u0430\u043a \u0434\u0432\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u043b\u044f\u043c\u0431\u0434\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441 \u0442\u0440\u0435\u043c\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438: \u043f\u0435\u0440\u0432\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u2014 \u044d\u0442\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <code>restinio::request_handle_t<\/code>, \u0430 \u0434\u0432\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u2014 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0442 producer-\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0441\u043b\u0443\u0447\u0430\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438\u0437 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430 \u0432 \u0432\u0438\u0434\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043f\u043e \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0435\u0441\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433 <code>path_to_params<\/code> \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <code>path_to_tuple<\/code>. \u041e\u0442\u043b\u0438\u0447\u0438\u0435 <code>path_to_tuple<\/code> \u043e\u0442 <code>path_to_params<\/code> \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e <code>path_to_tuple<\/code> \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 producer-\u0430\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u0432\u0438\u0434\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0442\u0443\u043f\u043b\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">router-&gt;http_get(    epr::path_to_tuple(&quot;\/api\/v1\/books\/&quot;, book_id_p, &quot;\/versions\/&quot;, ver_id_p),    [handler](const auto &amp; req, std::tuple&lt;std::uint64_t, std::string&gt; params) {       return handler-&gt;on_get_book_version(req, std::get&lt;0&gt;(params), std::get&lt;1&gt;(params));    });<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"chto-oznachaet-easy_parser-v-nazvanii-easy_parser_router\">\u0427\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 easy_parser \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 easy_parser_router?<\/h2>\n<p>  <\/p>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0437\u0430\u0434, \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0432 RESTinio <a href=\"https:\/\/stiffstream.com\/en\/docs\/restinio\/0.6\/workingwithheader.html#helpers-for-parsing-values-of-http-fields\" rel=\"nofollow\">\u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 HTTP-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432<\/a>, \u0432\u043d\u0443\u0442\u0440\u0438 RESTinio \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c easy_parser. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u043d\u0430 \u0431\u0430\u0437\u0435 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Parsing_expression_grammar\" rel=\"nofollow\">Parsing Expression Grammar (PEG)<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0440\u0430\u0436\u0430\u0442\u044c PEG-\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432 \u0432\u0438\u0434\u0435 C++\u043d\u043e\u0433\u043e DSL. \u041d\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">limit = &quot;limit&quot; [SPACE] &quot;:&quot; [SPACE] NUMBER SPACE &quot;bytes&quot;<\/code><\/pre>\n<p>  <\/p>\n<p>\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432\u0438\u0434\u0430 &quot;limit:4096 bytes&quot; \u0438\u043b\u0438 &quot;limit: 4096 bytes&quot;, \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c easy_parser-\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">using namespace restinio::easy_parser; auto parser = produce&lt;unsigned int&gt;(    exact(&quot;limit&quot;),    maybe(space()),    symbol(':'),    maybe(space()),    non_negative_decimal_number_p&lt;unsigned int&gt;(),    space(),    exact(&quot;bytes&quot;));<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043f\u0430\u0440\u0441\u0435\u0440 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u0435\u0441\u043b\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 <code>unsigned int<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e\u0432\u044b\u0439 easy_parser_router \u0432 RESTinio-0.6.6 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043d\u0430 \u0431\u0430\u0437\u0435 easy_parser-\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 easy_parser_router \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 easy_parser-\u0430 \u0438 \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 URL, \u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f <a href=\"https:\/\/stiffstream.com\/en\/docs\/restinio\/0.6\/easyparserrouter.html#easy-parser\" rel=\"nofollow\">\u0432 \u0434\u0435\u0431\u0440\u0438 easy_parser-\u0430<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0432\u0448\u0435\u0439\u0441\u044f \u043f\u0440\u043e\u043f\u0430\u0441\u0442\u0438 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c easy_parser, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e easy_parser_router-\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0432 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c <a href=\"https:\/\/github.com\/Stiffstream\/restinio-long-output-sample\" rel=\"nofollow\">\u0434\u0435\u043c\u043e-\u043f\u0440\u0438\u043c\u0435\u0440\u0435 long_output<\/a> \u0438\u0437 \u0432\u043e\u0442 <a href=\"https:\/\/habr.com\/ru\/post\/462349\/\">\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445 \u0441\u0443\u0442\u044c: \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 GET-\u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 URL \u0432\u0438\u0434\u0430 <code>\/<\/code>, <code>\/&lt;size&gt;<\/code> \u0438 <code>\/&lt;size&gt;\/&lt;count&gt;<\/code>, \u0433\u0434\u0435 <code>&lt;size&gt;<\/code> \u0438 <code>&lt;count&gt;<\/code> \u0437\u0430\u0434\u0430\u044e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u043c\u044b\u0445 \u0432 \u043e\u0442\u0432\u0435\u0442 \u0431\u043b\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, URL <code>\/512k\/1024<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432 \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u043e\u0441\u043b\u0430\u0442\u044c 1024 \u0431\u043b\u043e\u043a\u0430 \u043f\u043e 512KiB \u043a\u0430\u0436\u0434\u044b\u0439. \u0410 URL <code>\/1200\/500<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432 \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u043e\u0441\u043b\u0430\u0442\u044c 500 \u0431\u043b\u043e\u043a\u043e\u0432 \u043f\u043e 1200 \u0431\u0430\u0439\u0442.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 express-\u0440\u043e\u0443\u0442\u0435\u0440\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 URL \u043a\u043e\u0434 \u0438\u043c\u0435\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0438\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">std::size_t extract_chunk_size(const restinio::router::route_params_t &amp; params) {    const auto multiplier = [](const auto sv) noexcept -&gt; std::size_t {       if(sv.empty() || &quot;B&quot; == sv || &quot;b&quot; == sv) return 1u;       else if(&quot;K&quot; == sv || &quot;k&quot; == sv) return 1024u;       else return 1024u*1024u;    };     return restinio::cast_to&lt;std::size_t&gt;(params[&quot;value&quot;]) *          multiplier(params[&quot;multiplier&quot;]); } ... auto router = std::make_unique&lt;router_t&gt;();  router-&gt;http_get(&quot;\/&quot;, [&amp;ctx](auto req, auto) {...});  router-&gt;http_get(          R&quot;(\/:value(\\d+):multiplier([MmKkBb]?))&quot;,          [&amp;ctx](auto req, auto params) {        const auto chunk_size = extract_chunk_size(params);       ...    });  router-&gt;http_get(          R&quot;(\/:value(\\d+):multiplier([MmKkBb]?)\/:count(\\d+))&quot;,          [&amp;ctx](auto req, auto params) {        const auto chunk_size = extract_chunk_size(params);       const auto count = restinio::cast_to&lt;std::size_t&gt;(params[&quot;count&quot;]);       ...    });<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c easy_parser_router-\u0430 \u044d\u0442\u0430 \u0436\u0435 \u0446\u0435\u043b\u044c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">using namespace restinio::router::easy_parser_router;  auto router = std::make_unique&lt;router_t&gt;();  struct distribution_params {    std::size_t chunk_size_{100u*1024u};    std::size_t count_{10000u}; }; struct chunk_size { std::uint32_t c_{1u}, m_{1u}; };  router-&gt;http_get(    path_to_params(       produce&lt;distribution_params&gt;(          exact(&quot;\/&quot;),          maybe(             produce&lt;chunk_size&gt;(                non_negative_decimal_number_p&lt;std::uint32_t&gt;()                   &gt;&gt; &amp;chunk_size::c_,                maybe(                   produce&lt;std::uint32_t&gt;(                      alternatives(                         caseless_symbol_p('b') &gt;&gt; just_result(1u),                         caseless_symbol_p('k') &gt;&gt; just_result(1024u),                         caseless_symbol_p('m') &gt;&gt; just_result(1024u * 1024u)                      )                   ) &gt;&gt; &amp;chunk_size::m_                )             ) &gt;&gt; convert(                   [](auto cs) { return std::size_t{cs.c_} * cs.m_; })                &gt;&gt; &amp;distribution_params::chunk_size_,             maybe(                exact(&quot;\/&quot;),                non_negative_decimal_number_p&lt;std::size_t&gt;()                   &gt;&gt; &amp;distribution_params::count_             )          )       )    ),    [&amp;ctx](const auto &amp; req, const auto &amp; params ) { ... });<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422.\u0435. \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0440\u0435\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 URL \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e URL. \u0410 \u044d\u0442\u043e\u0442 URL \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c PEG-\u043f\u0440\u0430\u0432\u0438\u043b\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">path = &quot;\/&quot; [NUMBER [((B|b) | (K|k) | (M|m))] [&quot;\/&quot; NUMBER]]<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u043d\u043e\u0433\u043e\u044d\u0442\u0430\u0436\u043d\u043e\u0435 C++\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u044d\u0442\u043e\u0433\u043e PEG-\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 <code>distribution_params<\/code>, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0443\u0442 \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f: \u0440\u0430\u0437\u043c\u0435\u0440 \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0432 \u0431\u0430\u0439\u0442\u0430\u0445 \u0438 \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u043b\u043e\u043a\u043e\u0432. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c C++\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0431\u043b\u043e\u043a\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0436\u0438\u0442\u0435\u043b\u044c \u0432 \u0432\u0438\u0434\u0435 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u0430 <code>b<\/code>, <code>k<\/code> \u0438\u043b\u0438 <code>m<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u0435 \u0441 easy_parser \u0432\u0441\u0435 \u044d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u0438\u043a\u043e, \u043d\u0435\u0447\u0438\u0442\u0430\u0435\u043c\u043e \u0438 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u041d\u043e&#8230;<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043f\u0440\u0438\u0432\u044b\u043a\u0430\u0435\u0448\u044c. \u041f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0434\u0435\u043b\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a \u0441\u0435\u0431\u0435 \u043e\u0442\u0433\u043e\u0432\u043e\u0440\u043a\u0430 (\u0441\u0442\u043e\u043a\u0433\u043e\u043b\u044c\u043c\u0441\u043a\u0438\u0439 \u0441\u0438\u043d\u0434\u0440\u043e\u043c, \u0432\u0441\u0435 \u0434\u0435\u043b\u0430).\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043f\u043e \u043c\u0435\u0440\u0435 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u044b\u0442\u0430 \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 PEG-\u043f\u0440\u0430\u0432\u0438\u043b \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c \u0438 \u0432 \u043d\u0435\u043c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0448\u044c \u0447\u0435\u0442\u043a\u043e \u0432\u0438\u0434\u0435\u0442\u044c &quot;\u0432\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432\u043e\u0442 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0438 \u044d\u0442\u043e\u0433\u043e&quot;.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u0430\u043c\u043e\u0433\u043e easy_parser, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0435\u0433\u043e \u043a easy_parser_router-\u0443 \u0431\u044b\u043b\u043e \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0441\u0438\u043b. \u0418 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u2014 \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0435\u0435 \u0438\u0437 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c. \u0422\u0430\u043a \u0447\u0442\u043e, \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, don&#8217;t shoot the pianist\u2026 \u0410 \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0435\u0441\u043b\u0438 \u0443 \u043a\u043e\u0433\u043e-\u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0434\u0435\u0438, \u043a\u0430\u043a \u0434\u043e\u0441\u0442\u0438\u0447\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u0436\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u043c DSL \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 C++14, \u0442\u043e \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u0435\u0441\u044c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/p>\n<p>  <\/p>\n<p>\u0412\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0442\u043e, \u0447\u0442\u043e \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0432\u0441\u0435\u043c\u0438 \u044d\u0442\u0438\u043c\u0438 <code>produce<\/code>, <code>maybe<\/code>, <code>alternatives<\/code>, <code>just_result<\/code>, <code>convert<\/code> \u0438 \u043f\u0440. \u043d\u0435 \u0431\u0443\u0434\u0443. \u042d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0432\u044f\u0442\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u044a\u0435\u043c\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e. \u0422\u0430\u043a \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443-\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0442\u043e \u043e\u0442\u043f\u0438\u0448\u0438\u0442\u0435\u0441\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \u0415\u0441\u043b\u0438 \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 easy_parser-\u0430 \u043d\u0430\u0431\u0435\u0440\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430. \u041d\u0443 \u0430 \u043a\u0442\u043e \u043d\u0435 \u0445\u043e\u0447\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438, \u0442\u043e\u0442 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c <a href=\"https:\/\/stiffstream.com\/en\/docs\/restinio\/0.6\/easyparserrouter.html#easy-parser\" rel=\"nofollow\">\u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e<\/a>.<\/p>\n<p>  <\/p>\n<h1 id=\"neskolko-detaley-realizacii-iz-pod-kapota-easy_parser-a-i-easy_parser_router-a\">\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0437 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u0430 easy_parser-\u0430 \u0438 easy_parser_router-\u0430<\/h1>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u043d\u0435 \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 easy_parser \u0438 easy_parser_router, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u043e\u043c\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u0443 \u043d\u0430 \u0442\u0435\u043c\u0443 &quot;\u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e\u043e\u0431\u0449\u0435 \u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 C++ \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438&quot;. \u041d\u0435 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0434\u0435\u0441\u044c \u0431\u044b\u043b \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u0443\u0436 \u0445\u0430\u0440\u0434\u043a\u043e\u0440\u043d\u044b\u0439 C++, \u043f\u043e\u0441\u0435\u043c\u0443, \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043c\u0435\u043d\u044c\u0448\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u0447\u0435\u043c \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0434\u043b\u044f \u043c\u0435\u043d\u044f.<\/p>\n<p>  <\/p>\n<h2 id=\"shablony-result_value_wrapper-i-result_wrapper_for\">\u0428\u0430\u0431\u043b\u043e\u043d\u044b result_value_wrapper \u0438 result_wrapper_for<\/h2>\n<p>  <\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f easy_parser-\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 PEG-\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f DSL easy_parser-\u0430 \u2014 \u044d\u0442\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>produce<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">template&lt;typename Target_Type, typename... Clauses&gt; auto produce(Clauses &amp;&amp;... clauses);<\/code><\/pre>\n<p>  <\/p>\n<p>\u0413\u0434\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>Target_Type<\/code> \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u043c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0438\u043f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430. \u0410 \u0432\u043e\u0442 \u0442\u0438\u043f\u044b <code>Clauses<\/code> \u0432\u044b\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435 \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043b\u0438\u0448\u043d\u0438\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438, \u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u043f\u0438\u0448\u0435\u0442 \u0432 \u043a\u043e\u0434\u0435 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">\/\/ \u0413\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430: \/\/ kv = key &quot;-&gt;&quot; value \/\/ key = NUMBER \/\/ value = NUMBER struct KV{ int key; int value; }; produce&lt;KV&gt;(    decimal_number_p&lt;int&gt;() &gt;&gt; &amp;KV::key,    exact(&quot;-&gt;&quot;),    decimal_number_p&lt;int&gt;() &gt;&gt; &amp;KV::value);<\/code><\/pre>\n<p>  <\/p>\n<p>\u0442\u043e \u044d\u0442\u043e \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">expected&lt;KV, parsing_error_t&gt; try_produce_KV_(impl::input_t &amp; from) {    KV result_value;    {       impl::decimal_number_producer_t&lt;int&gt; p;       const auto r = p.try_produce(from);       if(!r) return make_unexpected(r.error());       impl::field_setter_consumer_t&lt;&amp;KV::key&gt; consumer;       consumer.consume(result_value, *r); \/\/ result_value.key = *r;    }    {       impl::exact_clause_t c{&quot;-&gt;&quot;};       const auto r = c.try_process(from, result_value);       if(r) return make_unexpected(*r);    }    {       impl::decimal_number_producer_t&lt;int&gt; p;       const auto r = p.try_produce(from);       if(!r) return make_unexpected(r.error());       impl::field_setter_consumer_t&lt;&amp;KV::value&gt; consumer;       consumer.consume(result_value, *r); \/\/ result_value.value = *r;    }    return result_value; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422.\u0435. \u0442\u0430\u043c, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>produce&lt;KV&gt;(clauses...)<\/code>, \u0442\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 <code>KV<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 <code>clauses<\/code>. \u0415\u0441\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0441\u0435\u0445 <code>clauses<\/code> \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a, \u0442\u043e \u044d\u0442\u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b <code>produce&lt;KV&gt;<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0432 \u0432\u044b\u0437\u043e\u0432\u0435 <code>produce&lt;T&gt;<\/code> \u0442\u0438\u043f <code>T<\/code> \u2014 \u044d\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 <code>int<\/code> \u0438\u043b\u0438 <code>long<\/code>, \u0438\u043b\u0438 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430. \u041d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <code>T<\/code> \u0437\u0430\u043f\u0440\u043e\u0441\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">\/\/ \u0413\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430: \/\/ keys_values = (kv [&quot;,&quot;])+ \/\/ kv = key &quot;-&gt;&quot; value \/\/ key = NUMBER \/\/ value = NUMBER struct KV{ int key; int value; }; produce&lt;std::vector&lt;KV&gt;&gt;(    repeat(1, N,       produce&lt;KV&gt;(          decimal_number_p&lt;int&gt;() &gt;&gt; &amp;KV::key,          exact(&quot;-&gt;&quot;),          decimal_number_p&lt;int&gt;() &gt;&gt; &amp;KV::value       ) &gt;&gt; to_container(),       maybe(exact(&quot;,&quot;))    ));<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422.\u0435. \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0441\u0442\u0440\u043e\u0438\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>KV<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0442\u0435\u043c \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0442\u0438\u043f\u0430 <code>std::vector&lt;KV&gt;<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0418 \u0432\u043e\u0442 \u043a\u0430\u043a \u0440\u0430\u0437 \u0441 \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043d\u0438\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 DSL-\u044f \u0434\u043b\u044f easy_parser_router-\u0430 \u0432\u044b\u0448\u043b\u0430 \u0437\u0430\u043a\u0430\u0432\u044b\u043a\u0430.<\/p>\n<p>  <\/p>\n<p>\u0412\u043d\u0435\u0437\u0430\u043f\u043d\u043e (\u0441) \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043e\u0431\u0440\u0430\u0437\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, &quot;\u0445\u0440\u0430\u043d\u044f\u0442 \u0441\u0432\u043e\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435&quot;, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043d\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f &quot;\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u043a\u043e\u043d\u0435\u0446 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430&quot; \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u043e. \u042d\u0442\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u043a\u0430\u043a <code>std::vector<\/code> \u0438 <code>std::string<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041d\u043e \u0435\u0441\u0442\u044c \u0438 <code>std::array<\/code>, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u043d\u044f\u0442\u0438\u044f, \u043a\u0430\u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u043f\u0438\u0448\u0435\u0442 \u0443 \u0441\u0435\u0431\u044f \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">produce&lt;std::array&lt;char, 8&gt;&gt;(    repeat(8, 8, hexdigit_p() &gt;&gt; to_container()));<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: \u0430 \u043a\u0430\u043a \u0443\u0437\u043d\u0430\u0442\u044c, \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u043c <code>std::array&lt;char, 8&gt;<\/code>?<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 <code>produce&lt;std::array&lt;char, 8&gt;&gt;<\/code> \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>std::array&lt;char, 8&gt;<\/code>, \u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0443\u0437\u043d\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u043a\u0430\u043a <code>std::array<\/code> \u043d\u0443\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043d\u043e \u0438 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u0410 \u0432\u043e\u0442 \u0434\u043b\u044f <code>std::vector<\/code> \u0438\u043b\u0438 <code>std::string<\/code> \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u0428\u0430\u0431\u043b\u043e\u043d <code>result_value_wrapper<\/code> \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u0432\u0435\u0441\u0442\u0438 \u0432 easy_parser \u043a\u0430\u043a \u0440\u0430\u0437 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b <code>produce&lt;T&gt;(clauses...)<\/code> \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 <code>produce<\/code> \u043f\u043e\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u0434\u0442\u0438 \u0440\u0430\u0437\u0431\u043e\u0440 <code>clauses<\/code>. \u0422.\u0435. \u0432\u044b\u0437\u043e\u0432 <code>produce&lt;T&gt;(...)<\/code> \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">expected_t&lt;T, parsing_error_t&gt; try_produce_T_(impl::input_t &amp; from) {    typename result_value_wrapper&lt;T&gt;::wrapped_type result_value;    ...    return result_value_wrapper&lt;T&gt;::unwrap_value(result_value); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 easy_parser-\u0435 \u0434\u043b\u044f <code>result_value_wrapper<\/code> \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f <code>std::vector<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">template&lt; typename T, typename... Args &gt; struct result_value_wrapper&lt; std::vector&lt; T, Args... &gt; &gt; {    using result_type = std::vector&lt; T, Args... &gt;;    using value_type = typename result_type::value_type;    using wrapped_type = result_type;     static void    as_result( wrapped_type &amp; to, result_type &amp;&amp; what )    {       to = std::move(what);    }     static void    to_container( wrapped_type &amp; to, value_type &amp;&amp; what )    {       to.push_back( std::move(what) );    }     RESTINIO_NODISCARD    static result_type &amp;&amp;    unwrap_value( wrapped_type &amp; v )    {       return std::move(v);    } };<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f <code>std::array<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">namespace impl {  template&lt; typename T, std::size_t S &gt; struct std_array_wrapper {    std::array&lt; T, S &gt; m_array;    std::size_t m_index{ 0u }; };  } \/* namespace impl *\/  template&lt; typename T, std::size_t S &gt; struct result_value_wrapper&lt; std::array&lt; T, S &gt; &gt; {    using result_type = std::array&lt; T, S &gt;;    using value_type = typename result_type::value_type;    using wrapped_type = impl::std_array_wrapper&lt; T, S &gt;;     static void    as_result( wrapped_type &amp; to, result_type &amp;&amp; what )    {       to.m_array = std::move(what);       to.m_index = 0u;    }     static void    to_container( wrapped_type &amp; to, value_type &amp;&amp; what )    {       if( to.m_index &gt;= S ) throw exception_t(...);        to.m_array[ to.m_index ] = std::move(what);       ++to.m_index;    }     RESTINIO_NODISCARD    static result_type &amp;&amp;    unwrap_value( wrapped_type &amp; v )    {       return std::move(v.m_array);    } };<\/code><\/pre>\n<p>  <\/p>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u0430\u043a\u0438\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c \u0432\u043d\u0443\u0442\u0440\u0438 <code>produce&lt;std::vector&lt;T&gt;&gt;(...)<\/code> \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e <code>std::vector&lt;T&gt;<\/code>, \u0430 \u0432\u043e\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 <code>produce&lt;std::array&lt;T, 10&gt;&gt;(...)<\/code> \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f <code>impl::std_array_wrapper&lt;T, 10&gt;<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 <code>result_value_wrapper<\/code> \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>produce<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">expected&lt;KV, parsing_error_t&gt; try_produce_KV_(impl::input_t &amp; from) {    typename result_value_wrapper&lt;KV&gt;::wrapped_type result_value;    {       impl::decimal_number_producer_t&lt;int&gt; p;       const auto r = p.try_produce(from);       if(!r) return make_unexpected(r.error());       impl::field_setter_consumer_t&lt;&amp;KV::key&gt; consumer;       consumer.consume(result_value, *r); \/\/ (1)    }    ... }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0442\u043e\u0447\u043a\u0435 (1) \u0432 \u043c\u0435\u0442\u043e\u0434 <code>consume<\/code> \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <code>result_value_wrapper&lt;KV&gt;::wrapped_type<\/code>. \u0418 \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>consume<\/code> \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0435\u0431\u0435, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435. \u041c\u043e\u0436\u0435\u0442 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <code>KV<\/code>, \u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u044d\u0442\u043e \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0432\u043e\u043a\u0440\u0443\u0433 <code>KV<\/code>. \u0418 \u043c\u0435\u0442\u043e\u0434\u0443 <code>consume<\/code> \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0447\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 &quot;\u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f&quot; \u043c\u0435\u0442\u0430\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <code>result_wrapper_for<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0442\u0438\u043f\u0443 <code>wrapped_type<\/code> \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0442\u0438\u043f <code>result_value_wrapper<\/code>. \u0427\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 <code>consume<\/code> \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">template&lt; typename Target_Type, typename Value &gt; void consume( Target_Type &amp; dest, Value &amp;&amp; src ) const {    using W = typename result_wrapper_for&lt;Target_Type&gt;::type;    W::as_result( dest, std::forward&lt;Value&gt;(src) ); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <code>result_value_wrapper<\/code> \u0432\u0432\u043e\u0434\u0438\u0442 \u0441\u0432\u043e\u0439 \u043e\u0441\u043e\u0431\u044b\u0439 \u0442\u0438\u043f <code>wrapped_type<\/code>, \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043e\u0442 <code>result_type<\/code>, \u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f <code>result_wrapper_for<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">template&lt; typename T, std::size_t S &gt; struct result_wrapper_for&lt; impl::std_array_wrapper&lt;T, S&gt; &gt; {    using type = result_value_wrapper&lt; std::array&lt; T, S &gt; &gt;; };<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432 <code>consume&lt;Target_Type, Value&gt;()<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <code>Target_Type<\/code> \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 <code>impl::std_array_wrapper&lt;T, S&gt;<\/code> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043b\u0443\u0436\u0438\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <code>wrapped_type<\/code> \u0434\u043b\u044f <code>std::array<\/code>), \u0442\u043e <code>consume<\/code> \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0443\u0441\u043b\u0443\u0433\u0430\u043c\u0438 <code>result_value_wrapper&lt;std::array&lt;T, S&gt;&gt;<\/code> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u0442\u0438\u043c <code>Target_Type<\/code>.<\/p>\n<p>  <\/p>\n<h2 id=\"transformer_proxy\">transformer_proxy<\/h2>\n<p>  <\/p>\n<p>\u0412 easy_parser \u0435\u0441\u0442\u044c \u0440\u044f\u0434 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li><strong>producer<\/strong> \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435;<\/li>\n<li><strong>transformer<\/strong> \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0435 producer-\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c transformer-\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>producer() &gt;&gt; transformer_one() &gt;&gt; transformer_two() &gt;&gt; transformer_three()<\/code>. \u0422.\u0435. transformer \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 <code>&gt;&gt;<\/code>, \u0433\u0434\u0435 \u0441\u043b\u0435\u0432\u0430 \u043e\u0442 \u043d\u0435\u0433\u043e \u0441\u0442\u043e\u0438\u0442 \u043b\u0438\u0431\u043e producer, \u043b\u0438\u0431\u043e transformer. \u0410 \u0441\u043f\u0440\u0430\u0432\u0430 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043b\u0438\u0431\u043e \u0434\u0440\u0443\u0433\u043e\u0439 transformer, \u043b\u0438\u0431\u043e consumer;<\/li>\n<li><strong>consumer<\/strong> &quot;\u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442&quot; \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0435 producer-\u043e\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u043a\u0443\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c consumer \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 <code>&gt;&gt;<\/code> \u0433\u0434\u0435 \u0441\u043b\u0435\u0432\u0430 \u0441\u0442\u043e\u0438\u0442 \u043b\u0438\u0431\u043e producer, \u043b\u0438\u0431\u043e transformer, \u0430 \u0432\u043e\u0442 \u0441\u043f\u0440\u0430\u0432\u0430 \u0443\u0436\u0435 \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435. \u0422.\u0435. consumer \u0432\u0441\u0435\u0433\u0434\u0430 \u0437\u0430\u043c\u044b\u043a\u0430\u0435\u0442 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 <code>&gt;&gt;<\/code>;<\/li>\n<li><strong>clause<\/strong>. \u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 <code>producer() &gt;&gt; ... &gt;&gt; consumer()<\/code>, \u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f clause, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f, \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442\u0441\u044f.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041a \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043f\u0440\u0435\u0434\u044a\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f. \u0422\u0430\u043a, \u0443 \u0442\u0438\u043f\u043e\u0432, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f producer-\u044b \u0438 transformer-\u044b, \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0442\u0438\u043f <code>result_type<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043a\u0430 \u0432 easy_parser-\u0435 \u0431\u044b\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 (\u0432\u0440\u043e\u0434\u0435 <code>to_lower<\/code> \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a\u0438) \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c <code>result_type<\/code> \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0445 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u043e.<\/p>\n<p>  <\/p>\n<p>\u0413\u0440\u0430\u0431\u043b\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0438\u0441\u044c \u043a\u043e\u0433\u0434\u0430 \u0440\u0443\u043a\u0438 \u0434\u043e\u0448\u043b\u0438 \u0434\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f <code>convert<\/code> (\u0435\u0433\u043e \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u0438 <code>map<\/code>): \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0434\u0430\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e (\u0444\u0443\u043d\u043a\u0442\u043e\u0440), \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f <code>convert<\/code> \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u0432\u044b\u0448\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">produce&lt;chunk_size&gt;(    non_negative_decimal_number_p&lt;std::uint32_t&gt;()       &gt;&gt; &amp;chunk_size::c_,    maybe(       produce&lt;std::uint32_t&gt;(          alternatives(             caseless_symbol_p('b') &gt;&gt; just_result(1u),             caseless_symbol_p('k') &gt;&gt; just_result(1024u),             caseless_symbol_p('m') &gt;&gt; just_result(1024u * 1024u)          )       ) &gt;&gt; &amp;chunk_size::m_    ) ) &gt;&gt; convert( \/\/ (1)       [](auto cs) { return std::size_t{cs.c_} * cs.m_; })    &gt;&gt; &amp;distribution_params::chunk_size_,<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432 \u0442\u043e\u0447\u043a\u0435 (1) \u0432 <code>convert<\/code> \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u043d\u0430\u044f \u043b\u044f\u043c\u0431\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0436\u0434\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 <code>chunk_size<\/code>, \u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>std::size_t<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u043d\u0430\u044f \u043b\u044f\u043c\u0431\u0434\u0430. \u0422.\u0435. \u0438\u043c\u0435\u044f \u043d\u0430 \u0440\u0443\u043a\u0430\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0443 \u043b\u044f\u043c\u0431\u0434\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441 \u043a\u0430\u043a\u0438\u043c \u0442\u0438\u043f\u043e\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0435\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438 \u043a\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043e\u043d\u0430 \u0432\u0435\u0440\u043d\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u0422.\u0435. \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>convert<\/code> \u0432\u0438\u0434\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">template&lt;typename Callable&gt; SomeTransformerType convert(Callable &amp;&amp; f) {...}<\/code><\/pre>\n<p>  <\/p>\n<p>\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0438\u043f transformer-\u0430.<\/p>\n<p>  <\/p>\n<p>\u041d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0433\u0438\u043f\u043e\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e SomeTransformerType \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f result_type. \u042d\u0442\u043e\u0442 \u0442\u0438\u043f \u0441\u0442\u0430\u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u043d\u0435 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043b\u044f\u043c\u0431\u0434\u044b \u0432 <code>convert<\/code>, \u0430 \u043f\u043e\u0437\u0436\u0435. \u041a\u043e\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b <code>convert<\/code> \u0431\u0443\u0434\u0435\u0442 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c producer-\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 easy_parser \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u0432\u0435\u0441\u0442\u0438 \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439: <strong>transformer_proxy<\/strong>.<\/p>\n<p>  <\/p>\n<p>Transformer_proxy \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f transfomer-\u043e\u043c, \u043d\u043e \u0437\u0430\u0442\u043e \u0437\u043d\u0430\u0435\u0442, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e transformer-\u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 transformer_proxy \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c producer-\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f transformer_proxy \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 <code>operator&gt;&gt;<\/code> \u043f\u043e\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">template&lt;    typename P,    typename T,    typename S = std::enable_if_t&lt;          is_producer_v&lt;P&gt; &amp; is_transformer_proxy_v&lt;T&gt;,          void &gt; &gt; RESTINIO_NODISCARD auto operator&gt;&gt;(P producer, T transformer_proxy ) {    auto real_transformer = transformer_proxy.template make_transformer&lt;           typename P::result_type &gt;();     using transformator_type = std::decay_t&lt; decltype(real_transformer) &gt;;     using producer_type = transformed_value_producer_t&lt; P, transformator_type &gt;;     return producer_type{ std::move(producer), std::move(real_transformer) }; };<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>convert<\/code>, \u0442.\u043a. \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 transformer_proxy, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0439 \u043b\u044f\u043c\u0431\u0434\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f. \u0418 \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e\u0442 transformer_proxy \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 <code>operator&gt;&gt;<\/code>, \u0442\u043e \u043f\u0440\u043e\u043a\u0441\u0438-\u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u0441\u0432\u043e\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u0435 <code>make_transformer<\/code> \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0435\u0431\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0442\u0438\u043f transformer-\u0430 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c <code>result_type<\/code> \u0432\u043d\u0443\u0442\u0440\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">template&lt; typename Converter &gt; class convert_transformer_proxy_t : public transformer_proxy_tag {    Converter m_converter;  public :    ...    template&lt; typename Input_Type &gt;    RESTINIO_NODISCARD    auto    make_transformer() const &amp;    {       using output_type = std::decay_t&lt;             decltype(m_converter(std::declval&lt;Input_Type&amp;&amp;&gt;())) &gt;;        return convert_transformer_t&lt; output_type, Converter &gt;{ m_converter };    }    ... };<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c <code>output_type<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 <code>make_transformer<\/code> \u2014 \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0435\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 <code>result_type<\/code> \u0434\u043b\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 <code>convert_transformer_t<\/code>.<\/p>\n<p>  <\/p>\n<h2 id=\"odin-iz-tryukov-pri-obrabotke-parametrov-path_to_paramspath_to_tuple\">\u041e\u0434\u0438\u043d \u0438\u0437 \u0442\u0440\u044e\u043a\u043e\u0432 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 path_to_params\/path_to_tuple<\/h2>\n<p>  <\/p>\n<p>\u0425\u043e\u0442\u044c easy_parser_router \u0438 \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 easy_parser, \u043d\u043e \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u043e\u0432 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043b\u044f easy_parser_router \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 DSL \u0432 \u0432\u0438\u0434\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <code>path_to_params<\/code> \u0438 <code>path_to_tuple<\/code>. \u041f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0432\u043e\u0442 \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">router-&gt;http_get(    path_to_params(&quot;\/&quot;),    [](const auto &amp; req) {...});  router-&gt;http_get(    path_to_params(&quot;\/api\/v1\/books\/&quot;, non_negative_decimal_number_p&lt;int&gt;()),    [](const auto &amp; req, int book_id) {...});<\/code><\/pre>\n<p>  <\/p>\n<p>\u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">router-&gt;http_get(    route_to_params(produce&lt;std::tuple&lt;&gt;&gt;(       exact_p(&quot;\/&quot;) &gt;&gt; just_result(std::tuple&lt;&gt;{}))),    [](const auto &amp; req) {});  router-&gt;http_get(    route_to_params(produce&lt;std::tuple&lt;int&gt;&gt;(       exact(&quot;\/api\/v1\/books\/&quot;),       non_negative_decimal_number_p&lt;int&gt;() &gt;&gt; to_tuple&lt;0&gt;())),   [](const auto &amp; req, int book_id) {...});<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u0447\u0438\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u0439 DSL \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0431\u0435\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>path_to_params<\/code> (<code>path_to_tuple<\/code>) \u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0438\u043f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e <code>std::tuple<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 URL \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0443\u0447\u0435\u0441\u0442\u044c <code>result_type<\/code> \u0434\u043b\u044f \u0432\u0441\u0435\u0445 producer-\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b \u0432 <code>path_to_params<\/code> (<code>path_to_tuple<\/code>);<\/li>\n<li>\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u044f clauses \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 URL.<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">path_to_params(&quot;\/&quot;)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0442\u0443\u043f\u043b\u0430 \u0434\u043b\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <code>std::tuple&lt;&gt;<\/code>. \u0410 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u044f clauses \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 <code>type_list&lt;exact_fragment_clause_t&gt;<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0432 \u0441\u043b\u0443\u0447\u0430\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">path_to_params(    &quot;\/api\/v1\/books\/&quot;,    non_negative_decimal_number_p&lt;int&gt;(),    &quot;\/versions\/&quot;,    path_fragment_p())<\/code><\/pre>\n<p>  <\/p>\n<p>\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u043c \u0442\u0443\u043f\u043b\u043e\u043c \u0434\u043b\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f <code>std::tuple&lt;int, std::string&gt;<\/code>, \u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u044f clauses \u0431\u0443\u0434\u0435\u0442 \u0447\u0435\u043c-\u0442\u043e \u0432\u0440\u043e\u0434\u0435: <code>type_list&lt;exact_fragment_clause_t, tuple_item_consumer_t&lt;0, non_negative_decimal_number_producer_t&lt;int&gt;&gt;, exact_fragment_clause_t, tuple_item_consumer_t&lt;1, path_fragment_producer_t&gt;&gt;<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u044d\u0442\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 easy_parser_router \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0433\u0440\u0430\u0435\u0442 \u0440\u043e\u043b\u044c \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0439 \u043c\u0435\u0442\u0430\u0444\u0443\u043d\u043a\u0446\u0438\u0438):<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">template&lt; typename... Args &gt; struct dsl_processor {    static_assert( 0u != sizeof...(Args), &quot;Args can't be an empty list&quot; );     using arg_types = meta::transform_t&lt;          dsl_details::special_decay, meta::type_list&lt;Args...&gt; &gt;;     using result_tuple = dsl_details::detect_result_tuple_t&lt; arg_types &gt;;     using clauses_tuple = dsl_details::make_clauses_types_t&lt; arg_types &gt;; };<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u044d\u0442\u043e\u0439 \u043c\u0435\u0442\u0430\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c, \u0430 \u0437\u0430\u043e\u0441\u0442\u0440\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0434\u0432\u0443\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u0430\u0445: \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 <code>arg_types<\/code> \u0438 <code>result_tuple<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0422\u0438\u043f <code>arg_types<\/code> \u2014 \u044d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u043e\u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043d\u043e \u0442\u0438\u043f\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043e\u0442 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0442\u0438\u043f\u0430 const\/volatile \u0438 \u0441\u0441\u044b\u043b\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u0413\u0440\u0443\u0431\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u0435\u0441\u043b\u0438 \u0432 Args \u0434\u043b\u044f <code>dsl_processor<\/code> \u0435\u0441\u0442\u044c <code>const T&amp;<\/code>, \u0442\u043e \u0432 <code>arg_types<\/code> \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0437\u0430\u043c\u0435\u043d\u0435\u043d \u043d\u0430 \u0442\u0438\u043f <code>T<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>arg_types<\/code> \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043c\u0435\u0442\u0430-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 transform, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0439 \u043d\u0430\u0434 \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438 \u0442\u0438\u043f\u043e\u0432. \u042d\u0442\u0430 \u043c\u0435\u0442\u0430\u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0435\u0439 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e <code>dsl_details::special_decay<\/code>) \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0438\u043f\u043e\u0432. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u043e\u0432, \u043f\u043e\u0440\u043e\u0436\u0434\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u043c.<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/github.com\/Stiffstream\/restinio\/blob\/v.0.6.6\/dev\/restinio\/utils\/metaprogramming.hpp#L205-L263\" rel=\"nofollow\"><code>\u0412 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 meta::transform_t<\/code><\/a> \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0432\u044b\u0434\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f, \u0431\u043b\u0430\u0433\u043e \u0432 C++14 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438 \u0442\u0438\u043f\u043e\u0432 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0442\u044c \u0432 \u0441\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (\u0432\u0440\u043e\u0434\u0435 Boost-\u0430).<\/p>\n<p>  <\/p>\n<p>\u0410 \u0432\u043e\u0442 \u043f\u0440\u043e \u0432\u044b\u0432\u043e\u0434 \u0442\u0438\u043f\u0430 <code>result_tuple<\/code> \u043c\u043e\u0436\u043d\u043e \u0438 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f <code>result_tuple<\/code> \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u043e\u0431\u0435\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u0442\u0438\u043f\u043e\u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>path_to_params<\/code> (<code>path_to_tuple<\/code>) \u0438 \u0434\u043b\u044f \u0442\u0435\u0445 \u0442\u0438\u043f\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f producer-\u0430\u043c\u0438, \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432 \u0435\u0434\u0438\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0445 <code>result_type<\/code>. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">template&lt; typename Args_Type_List &gt; struct detect_result_tuple {    using type = meta::rename_t&lt;          typename result_tuple_detector&lt;                Args_Type_List,                meta::type_list&lt;&gt; &gt;::type,          std::tuple &gt;; };  template&lt; typename Args_Type_List &gt; using detect_result_tuple_t = typename detect_result_tuple&lt;Args_Type_List&gt;::type;<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u0430\u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>detect_result_tuple<\/code> \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0435\u0449\u0435 \u043e\u0434\u043d\u043e\u0439 \u043c\u0435\u0442\u0430\u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>result_tuple_detector<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0443\u0436\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432. \u041d\u043e <code>result_tuple_detector<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>type_list&lt;T...&gt;<\/code>, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d <code>std::tuple&lt;T...&gt;<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 <code>detect_result_tuple<\/code> \u0431\u0435\u0440\u0435\u0442 \u044d\u0442\u043e\u0442 <code>type_list&lt;T...&gt;<\/code> \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 <code>std::tuple&lt;T...&gt;<\/code> \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 <a href=\"https:\/\/github.com\/Stiffstream\/restinio\/blob\/v.0.6.6\/dev\/restinio\/utils\/metaprogramming.hpp#L167-L203\" rel=\"nofollow\">\u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0435\u0442\u0430\u0444\u0443\u043d\u043a\u0446\u0438\u0438 rename<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0441\u0435 \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 <code>result_tuple_detector<\/code>. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0435\u0435 \u043f\u043e\u0431\u043b\u0438\u0436\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">template&lt; typename From, typename To &gt; struct result_tuple_detector;  template&lt;    template&lt;class...&gt; class From,    typename... Sources,    template&lt;class...&gt; class To,    typename... Results &gt; struct result_tuple_detector&lt; From&lt;Sources...&gt;, To&lt;Results...&gt; &gt; {    using type = typename result_tuple_detector&lt;          meta::tail_of_t&lt; Sources... &gt;,          typename add_type_if_necessary&lt;                meta::head_of_t&lt; Sources... &gt;,                To&lt; Results... &gt; &gt;::type       &gt;::type; };  template&lt;    template&lt;class...&gt; class From,    template&lt;class...&gt; class To,    typename... Results &gt; struct result_tuple_detector&lt; From&lt;&gt;, To&lt;Results...&gt; &gt; {    using type = To&lt;Results...&gt;; };<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043a\u0430\u043a \u0438 \u044f \u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u0441 \u043c\u0435\u0442\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0432 C++ \u043d\u0430 &quot;\u0412\u044b, \u0412\u0430\u0448\u0435\u0432\u044b\u0441\u043e\u043a\u043e\u0431\u043b\u0430\u0433\u043e\u0440\u043e\u0434\u044c&#8230;&quot; \u043f\u043e\u044f\u0441\u043d\u044e, \u0447\u0442\u043e \u0444\u043e\u043a\u0443\u0441 \u0437\u0434\u0435\u0441\u044c \u0432 \u0434\u0432\u0443\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 result_tuple_detector. \u0412\u0442\u043e\u0440\u0430\u044f, \u0441\u0430\u043c\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">template&lt;    template&lt;class...&gt; class From,    template&lt;class...&gt; class To,    typename... Results &gt; struct result_tuple_detector&lt; From&lt;&gt;, To&lt;Results...&gt; &gt; {    using type = To&lt;Results...&gt;; };<\/code><\/pre>\n<p>  <\/p>\n<p>\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438. \u042d\u0442\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0442\u0438\u043f\u044b \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0438\u043f\u043e\u0432 \u0443\u0436\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u044b. \u0418 \u0432\u0441\u0435, \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u2014 \u044d\u0442\u043e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u043e\u0432 \u0438\u0442\u043e\u0433\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u0441\u0435\u0439 \u043c\u0435\u0442\u0430\u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>result_tuple_detector<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0410 \u0432\u043e\u0442 \u043f\u0435\u0440\u0432\u0430\u044f, \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">template&lt;    template&lt;class...&gt; class From,    typename... Sources,    template&lt;class...&gt; class To,    typename... Results &gt; struct result_tuple_detector&lt; From&lt;Sources...&gt;, To&lt;Results...&gt; &gt; {    using type = typename result_tuple_detector&lt;          meta::tail_of_t&lt; Sources... &gt;,          typename add_type_if_necessary&lt;                meta::head_of_t&lt; Sources... &gt;,                To&lt; Results... &gt; &gt;::type       &gt;::type; };<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430 \u0435\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c: \u043a\u043e\u0433\u0434\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0438\u043f\u043e\u0432 \u0435\u0449\u0435 \u043d\u0435 \u043f\u0443\u0441\u0442, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e &quot;\u0432\u044b\u0437\u0432\u0430\u0442\u044c&quot; \u0441\u0430\u043c\u0443 \u0441\u0435\u0431\u044f, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0438\u043f\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0445\u0432\u043e\u0441\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430, \u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0438\u043f\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>add_type_if_necessary&lt;H, R_List&gt;<\/code>. \u0412 \u044d\u0442\u0443 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0433\u043e\u043b\u043e\u0432\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0438\u043f\u043e\u0432 \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>add_type_if_necessary&lt;H, R_List&gt;<\/code> \u043b\u0438\u0431\u043e \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a (<code>R_List<\/code>), \u0435\u0441\u043b\u0438 <code>H<\/code> \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0438\u043f\u043e\u043c producer-\u0430. \u041b\u0438\u0431\u043e \u0436\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a <code>R_List<\/code> \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d <code>H::result_type<\/code>, \u0435\u0441\u043b\u0438 <code>H<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0438\u043f\u043e\u043c producer-\u0430.<\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <code>add_type_if_necessary<\/code> \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"cpp\">template&lt; typename H, typename R, bool Is_Producer &gt; struct add_type_if_necessary_impl;  template&lt;    typename H,    template&lt;class...&gt; class To,    typename... Results &gt; struct add_type_if_necessary_impl&lt; H, To&lt;Results...&gt;, false &gt; {    using type = To&lt;Results...&gt;; };  template&lt;    typename H,    template&lt;class...&gt; class To,    typename... Results &gt; struct add_type_if_necessary_impl&lt; H, To&lt;Results...&gt;, true &gt; {    using type = To&lt;Results..., typename H::result_type&gt;; };  \/\/ Adds type H to type list R if H is a producer. template&lt; typename H, typename R &gt; struct add_type_if_necessary    : add_type_if_necessary_impl&lt; H, R, ep::impl::is_producer_v&lt;H&gt; &gt; {};<\/code><\/pre>\n<p>  <\/p>\n<p>\u0433\u0434\u0435 <code>is_producer_v<\/code> \u2014 \u044d\u0442\u043e <a href=\"https:\/\/github.com\/Stiffstream\/restinio\/blob\/v.0.6.6\/dev\/restinio\/helpers\/easy_parser.hpp#L918-L938\" rel=\"nofollow\">\u043c\u0435\u0442\u0430\u0444\u0443\u043d\u043a\u0446\u0438\u044f-\u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 \u0438\u0437 easy_parser<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0438\u043f \u0442\u0438\u043f\u043e\u043c producer-\u0430 \u0438\u043b\u0438 \u043d\u0435\u0442.<\/p>\n<p>  <\/p>\n<h1 id=\"zaklyuchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h1>\n<p>  <\/p>\n<h2 id=\"easy_parser_router----eto-eksperiment\">easy_parser_router \u2014 \u044d\u0442\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442&#8230;<\/h2>\n<p>  <\/p>\n<p>\u2026 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0442\u0430\u043d\u0435\u0442 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043b\u0438\u0448\u044c \u043f\u043e \u043f\u0440\u043e\u0448\u0435\u0441\u0442\u0432\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041c\u043d\u0435 \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u044b\u043b \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0440\u0430\u0437 \u0443\u0436 C++ \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 \u0432 compile-time, \u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u044d\u0442\u0438 \u043d\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0442\u0430\u043a\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u0440\u043e\u0443\u0442\u0435\u0440 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 C++ \u2014 \u044d\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u0435\u043d\u044c\u043a\u043e\u0435, \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0435 \u0438 \u043d\u0435\u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u0435. \u041f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u044f \u0441\u0445\u043e\u0434\u0443 \u043d\u0435 \u0441\u043c\u043e\u0433\u0443 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0447\u0435\u0433\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0432 \u0436\u0438\u0432\u044b\u0445 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430\u0445 RESTinio.<\/p>\n<p>  <\/p>\n<p>\u0418 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e, \u0442.\u043a. \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443. \u0410 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 easy_parser \u2014 \u044d\u0442\u043e \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0448\u0442\u0443\u043a\u0430. \u0425\u043e\u0442\u044f \u043c\u044b \u0438 \u0441\u0442\u0430\u0440\u0430\u043b\u0438\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0432 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0441.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0437\u0430\u0439\u0434\u0435\u0442 \u0438\u043b\u0438 \u043d\u0435\u0442.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0432\u0442\u043e\u0440\u044e\u0441\u044c, \u0447\u0442\u043e \u043c\u043d\u0435 \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0448\u043b\u043e. \u041d\u043e \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u043d\u0443 \u0447\u0442\u043e \u043f\u043e\u0434\u0435\u043b\u0430\u0442\u044c. \u0425\u043e\u0442\u044f \u0431\u044b \u043f\u043e\u043f\u044b\u0442\u0430\u043b\u0438\u0441\u044c.<\/p>\n<p>  <\/p>\n<h2 id=\"ya-ne-nastoyaschiy-svarschik\">\u042f \u043d\u0435 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0441\u0432\u0430\u0440\u0449\u0438\u043a<\/h2>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441 easy_parser \u0438 easy_parser_router \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432 RESTinio \u043c\u043d\u043e\u0439. \u0410 \u043c\u043d\u0435 \u0445\u043e\u0442\u044c \u0435\u0449\u0435 \u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434, \u043d\u043e \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u044c \u0442\u043e\u0433\u043e, \u0447\u0435\u043c \u043c\u043d\u0435 \u0434\u043e\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432\u044b\u0448\u0435, \u043a\u0430\u043a \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 C++. \u042d\u0442\u043e \u043b\u0438\u0448\u044c \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0443 \u043c\u0435\u043d\u044f.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0449\u0435, \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0438 \u043c\u043e\u0449\u043d\u0435\u0435. \u0423 \u043c\u0435\u043d\u044f \u0432\u044b\u0448\u043b\u043e \u0432\u043e\u0442 \u0442\u0430\u043a. \u0423 \u0432\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u043b\u0443\u0447\u0448\u0435.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0434\u0430\u0436\u0435 \u043c\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0430\u043c \u043d\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c, \u0442\u043e \u043e\u043d\u0430 \u043f\u043e\u0434\u0442\u043e\u043b\u043a\u043d\u0435\u0442 \u043a\u043e\u0433\u043e-\u0442\u043e \u0438\u0437 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043a \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043c \u0432 \u044d\u0442\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438. \u0418 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0434\u043b\u044f C++ \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0435\u0449\u0435 \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0435, \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u043a\u0440\u0443\u0433 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p>  <\/p>\n<p>\u041d\u0443 \u0430 \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c \u0438 \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u043b\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c RESTinio \u0438 easy_parser_router \u0432 \u0434\u0435\u043b\u0435, \u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u0432\u0441\u0435 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0435 \u0437\u0440\u044f.<\/p>\n<p>  <\/p>\n<h2 id=\"eto-vse\">\u042d\u0442\u043e \u0432\u0441\u0435<\/h2>\n<p>  <\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0442\u0435\u043c, \u0443 \u043a\u043e\u0433\u043e \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u0442\u0435\u0440\u043f\u0435\u043d\u0438\u044f \u0434\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u044d\u0442\u043e\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u043a\u043e\u0433\u043e-\u0442\u043e \u0435\u0441\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 RESTinio, easy_parser \u0438\/\u0438\u043b\u0438 easy_parser_router, \u0442\u043e \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043d\u0430 \u043d\u0438\u0445 \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u043e\u0436\u0435\u043b\u0430\u043d\u0438\u044f \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u044b \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 RESTinio.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/497508\/\"> https:\/\/habr.com\/ru\/post\/497508\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/497508\/\">\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bh\/ei\/td\/bheitd3ichxc6a_l2tu_npnbvag.png\"><\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/github.com\/Stiffstream\/restinio\" rel=\"nofollow\">RESTinio<\/a>, \u043d\u0430\u0448 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0439 HTTP-\u0441\u0435\u0440\u0432\u0435\u0440, <a href=\"https:\/\/stiffstream.com\/ru\/news\/2020\/4\/restinio_0_6_6_released.html\" rel=\"nofollow\">\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f<\/a>. \u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 RESTinio \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0432 \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u0435\u0439\u0448\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e\u044d\u0442\u0430\u0436\u043d\u044b\u0435 C++\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b (\u043e \u0447\u0435\u043c \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u043d\u0435\u0435: <a href=\"https:\/\/habr.com\/ru\/post\/345788\/\">1<\/a>, <a href=\"https:\/\/habr.com\/ru\/post\/456632\/\">2<\/a>).<\/p>\n<p>  <\/p>\n<p>C++\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0432 RESTinio \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u044b \u043d\u0435 \u0440\u0430\u0434\u0438 \u043b\u044e\u0431\u0432\u0438 \u043a \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0443, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0446\u0435\u043b\u0438, \u043f\u0440\u0435\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u0443\u044e \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 RESTinio: \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u0433\u0438\u0431\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0431\u044b \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c (\u0430 \u043b\u0443\u0447\u0448\u0435 \u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c) \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0433\u043b\u0443\u043f\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a, \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u043b\u0438\u0448\u044c \u0432 run-time. \u041a\u0430\u043a \u0440\u0430\u0437 \u043e\u0431 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u043c \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0432 RESTinio, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438 \u0441\u043b\u0443\u0436\u0438\u0442 \u0446\u0435\u043b\u0438 \u0437\u0430\u0449\u0438\u0442\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e\u0442 \u043d\u0435\u043f\u0440\u0435\u0434\u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0438 \u043e\u043f\u0435\u0447\u0430\u0442\u043e\u043a, \u0438 \u043f\u043e\u0439\u0434\u0435\u0442 \u0440\u0435\u0447\u044c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435. \u0410 \u0442\u0430\u043a\u0436\u0435 \u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u0435\u0442\u0430\u043b\u044f\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u0438\u0445 \u043d\u043e\u0432\u043e\u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0442\u0435\u0445, <s>\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0442\u0435\u043c\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0441\u0438\u043b\u044b<\/s> \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<h1 id=\"easy_parser_router-kak-alternativa-express-router-u\">easy_parser_router \u043a\u0430\u043a \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 express-router-\u0443<\/h1>\n<p>  <\/p>\n<h2 id=\"express-router-i-chto-s-nim-ne-tak\">express-router \u0438 \u0447\u0442\u043e \u0441 \u043d\u0438\u043c \u043d\u0435 \u0442\u0430\u043a?<\/h2>\n<p>  <\/p>\n<p>\u0420\u043e\u0443\u0442\u0435\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e <a href=\"https:\/\/expressjs.com\/\" rel=\"nofollow\">ExpressJS<\/a> \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 RESTinio \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0430\u0432\u043d\u043e, \u043f\u0430\u0440\u0443 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434. \u0428\u0442\u0443\u043a\u0430 \u044d\u0442\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u0430\u044f, \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u0430\u044f \u043c\u043d\u043e\u0433\u0438\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043e\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0438 \u0448\u0438\u0440\u043e\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u0430\u044f. \u041d\u043e, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u0440\u0438\u0448\u0435\u0434\u0448\u0430\u044f \u0438\u0437 \u043c\u0438\u0440\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438-\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432. \u0418, \u043f\u043e\u0441\u0435\u043c\u0443, \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0432\u0448\u0430\u044f \u0440\u044f\u0434 \u043f\u0440\u0438\u0441\u0443\u0449\u0438\u0445 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0435 \u0440\u043e\u0434\u043e\u0432\u044b\u0445 \u0442\u0440\u0430\u0432\u043c.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-301991","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/301991","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=301991"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/301991\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=301991"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=301991"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=301991"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}