{"id":375946,"date":"2024-05-21T06:37:49","date_gmt":"2024-05-21T06:37:49","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=375946"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=375946","title":{"rendered":"<span>\u041a\u043d\u0438\u0433\u0430 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432 Rust. 2\/2<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/fj\/yi\/qn\/fjyiqnduv3l-rdgxnbu_t_qpgxk.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/fj\/yi\/qn\/fjyiqnduv3l-rdgxnbu_t_qpgxk.jpeg\" data-blurred=\"true\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>Hello world!<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/rust-lang-nursery.github.io\/rust-cookbook\/\">\u041a\u043d\u0438\u0433\u0430 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432<\/a> \u2014 \u044d\u0442\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0440\u0435\u0439\u0442\u043e\u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b <code>Rust<\/code>.<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/811915\/\">\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/a><\/li>\n<li><a href=\"https:\/\/my-js.org\/docs\/guide\/rust-cookbook\">\u041a\u043d\u0438\u0433\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c<\/a><\/li>\n<\/ul>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2 id=\"soderzhanie\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<ul>\n<li><a href=\"#10-%D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5\">10. \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/a><br \/> \n<ul>\n<li><a href=\"#101-%D0%BD%D0%B0%D0%B1%D0%BE%D1%80%D1%8B-%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%BE%D0%B2\">10.1. \u041d\u0430\u0431\u043e\u0440\u044b \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432<\/a><\/li>\n<li><a href=\"#102-%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0-csv\">10.2. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 CSV<\/a><\/li>\n<li><a href=\"#103-%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5\">10.3. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#11-%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0-%D0%BE%D1%88%D0%B8%D0%B1%D0%BE%D0%BA\">11. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/a><\/li>\n<li><a href=\"#12-%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%B0%D1%8F-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0\">12. \u0424\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430<\/a><br \/> \n<ul>\n<li><a href=\"#121-%D1%87%D1%82%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B8-%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C\">12.1. \u0427\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c<\/a><\/li>\n<li><a href=\"#122-%D0%BE%D0%B1%D1%85%D0%BE%D0%B4-%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%B8%D0%B8\">12.2. \u041e\u0431\u0445\u043e\u0434 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#13-%D1%80%D0%B0%D0%B7%D0%BD%D0%BE%D0%B5\">13. \u0420\u0430\u0437\u043d\u043e\u0435<\/a><\/li>\n<li><a href=\"#14-%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0\">14. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430<\/a><br \/> \n<ul>\n<li><a href=\"#141-%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D1%8F%D1%8F-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0\">14.1. \u0412\u043d\u0435\u0448\u043d\u044f\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#15-%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0-%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0\">15. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430<\/a><br \/> \n<ul>\n<li><a href=\"#151-%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5-%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F\">15.1. \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/a><\/li>\n<li><a href=\"#153-%D1%80%D0%B0%D0%B7%D0%B1%D0%BE%D1%80-%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8\">15.3. \u0420\u0430\u0437\u0431\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0438<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#16-%D0%B2%D0%B5%D0%B1-%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0\">16. \u0412\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/a><br \/> \n<ul>\n<li><a href=\"#161-%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D1%81%D1%8B%D0%BB%D0%BE%D0%BA\">16.1. \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a<\/a><\/li>\n<li><a href=\"#162-url\">16.2. URL<\/a><\/li>\n<li><a href=\"#163-%D1%82%D0%B8%D0%BF%D1%8B-%D0%BC%D0%B5%D0%B4%D0%B8%D0%B0\">16.3. \u0422\u0438\u043f\u044b \u043c\u0435\u0434\u0438\u0430<\/a><\/li>\n<li><a href=\"#163-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D1%8B\">16.3. \u041a\u043b\u0438\u0435\u043d\u0442\u044b<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p><em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>:: \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u041a\u043d\u0438\u0433\u0438 \u0432\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0444\u0430\u0439\u043b <code>Cargo.toml<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">[package] name = \"rust_cookbook\" version = \"0.1.0\" edition = \"2021\"  [dependencies] chrono = \"0.4.31\" crossbeam = \"0.8.3\" crossbeam-channel = \"0.5.10\" csv = \"1.3.0\" env_logger = \"0.11.3\" error-chain = \"0.12.4\" glob = \"0.3.1\" image = \"0.25.0\" lazy_static = \"1.4.0\" log = \"0.4.20\" mime = \"0.3.17\" num = \"0.4.1\" num_cpus = \"1.16.0\" postgres = \"0.19.7\" rand = \"0.8.5\" rayon = \"1.8.0\" regex = \"1.10.2\" reqwest = {version = \"0.11.23\", features = [\"blocking\", \"json\"]} same-file = \"1.0.6\" select = \"0.6.0\" serde = {version = \"1.0.193\", features = [\"derive\"]} serde_json = \"1.0.110\" threadpool = \"1.8.1\" tokio = { version = \"1.35.1\", features = [\"full\"] } unicode-segmentation = \"1.10.1\" url = \"2.5.0\" walkdir = \"2.4.0\" dotenv = \"0.15.0\" tempfile = \"3.9.0\" data-encoding = \"2.5.0\" ring = \"0.17.7\" clap = \"4.5.2\" ansi_term = \"0.12.1\" flate2 = \"1.0.28\" tar = \"0.4.40\" semver = \"1.0.22\" percent-encoding = \"2.3.1\" base64 = \"0.22.0\" toml = \"0.8.12\" memmap = \"0.7.0\"  [dependencies.rusqlite] version = \"0.31.0\" features = [\"bundled\"]<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 <em>\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 Linux.<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/790556\/\">\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e Rust<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/785096\/\">\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0448\u043f\u0430\u0440\u0433\u0430\u043b\u043a\u0430 \u043f\u043e Rust<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h1 id=\"10-kodirovanie\">10. \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h1>\n<p>  <\/p>\n<h2 id=\"101-nabory-simvolov\">10.1. \u041d\u0430\u0431\u043e\u0440\u044b \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432<\/h2>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u043e\u0446\u0435\u043d\u0442\u043d\u043e\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Percent-encoding\">\u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a> \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <a href=\"https:\/\/docs.rs\/percent-encoding\/*\/percent_encoding\/fn.utf8_percent_encode.html\">uft8_percent_encode<\/a> \u0438\u0437 \u043a\u0440\u0435\u0439\u0442\u0430 <a href=\"https:\/\/docs.rs\/percent-encoding\">percent-encoding<\/a>. \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <a href=\"https:\/\/docs.rs\/percent-encoding\/*\/percent_encoding\/fn.percent_decode.html\">percent_decode<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use percent_encoding::{utf8_percent_encode, percent_decode, AsciiSet, CONTROLS}; use std::str::Utf8Error;  \/\/\/ https:\/\/url.spec.whatwg.org\/#fragment-percent-encode-set const FRAGMENT: &amp;AsciiSet = &amp;CONTROLS.add(b' ').add(b'\"').add(b'&lt;').add(b'>').add(b'`');  fn main() -> Result&lt;(), Utf8Error> {     let input = \"confident, productive systems programming\";      \/\/ \u041a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443     let iter = utf8_percent_encode(input, FRAGMENT);     let encoded: String = iter.collect();     assert_eq!(encoded, \"confident,%20productive%20systems%20programming\");      \/\/ \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443     let iter = percent_decode(encoded.as_bytes());     let decoded = iter.decode_utf8()?;     assert_eq!(decoded, \"confident, productive systems programming\");      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u0431\u043e\u0440 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043e\u043a (<code>FRAGMENT<\/code>) \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u0431\u0430\u0439\u0442\u044b (\u043f\u043e\u043c\u0438\u043c\u043e \u0431\u0430\u0439\u0442\u043e\u0432, \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u0442 ASCII, \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f (controls)) \u0434\u043e\u043b\u0436\u043d\u044b \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0421\u043e\u0441\u0442\u0430\u0432 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>url<\/code> \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 <code>?<\/code> \u0432 \u043f\u0443\u0442\u0438 (path) URL, \u043d\u043e \u043d\u0435 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (query string).<\/p>\n<p>  <\/p>\n<p><code>utf8_percent_encode<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u0440\u0435\u0437\u043e\u0432 <code>&amp;str<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f (collect) \u0432 <code>String<\/code>.<\/p>\n<p>  <\/p>\n<p><strong>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 application\/x-www-form-urlencoded<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 <a href=\"https:\/\/url.spec.whatwg.org\/#application\/x-www-form-urlencoded\">application\/x-www-form-urlencoded<\/a> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/url\/*\/url\/form_urlencoded\/fn.byte_serialize.html\">form_urlencoded::byte_serialize<\/a>. \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/url\/*\/url\/form_urlencoded\/fn.byte_serialize.html\">form_urlencoded::parse<\/a>. \u041e\u0431\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f (collect) \u0432 <code>String<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use url::form_urlencoded::{byte_serialize, parse};  fn main() {     \/\/ \u041a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443     let urlencoded: String = byte_serialize(\"What is \u2764?\".as_bytes()).collect();     assert_eq!(urlencoded, \"What+is+%E2%9D%A4%3F\");      \/\/ \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443     let decoded: String = parse(urlencoded.as_bytes())         .map(|(key, val)| [key, val].concat())         .collect();     assert_eq!(decoded, \"What is \u2764?\"); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0428\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  <\/p>\n<p>\u041a\u0440\u0435\u0439\u0442 <a href=\"https:\/\/docs.rs\/data-encoding\/latest\/data_encoding\/\">data_encoding<\/a> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <code>HEXUPPER::encode<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 <code>&amp;[u8]<\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>String<\/code>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044e \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e\u0442 \u043a\u0440\u0435\u0439\u0442 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <code>HEXUPPER::decode<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 <code>&amp;[u8]<\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>Vec&lt;u8><\/code> \u043f\u0440\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use data_encoding::{DecodeError, HEXUPPER};  fn main() -> Result&lt;(), DecodeError> {     let original = b\"The quick brown fox jumps over the lazy dog.\";     let expected = \"54686520717569636B2062726F776E20666F78206A756D7073206F76\\         657220746865206C617A7920646F672E\";      \/\/ \u041a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435     let encoded = HEXUPPER.encode(original);     assert_eq!(encoded, expected);      \/\/ \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435     let decoded = HEXUPPER.decode(&amp;encoded.into_bytes())?;     assert_eq!(decoded, original);      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>base64 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong><\/p>\n<p>  <\/p>\n<p>\u041a\u0440\u0435\u0439\u0442 <a href=\"https:\/\/docs.rs\/base64\">base64<\/a> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b <a href=\"https:\/\/docs.rs\/base64\/*\/base64\/fn.encode.html\">encode<\/a> \u0438 <a href=\"https:\/\/docs.rs\/base64\/*\/base64\/fn.decode.html\">decode<\/a> \u0434\u043b\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0445 \u0441\u0440\u0435\u0437\u043e\u0432 \u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Base64\">base64<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain;  use base64::{engine::general_purpose::STANDARD, Engine as _}; use std::str;  error_chain! {     foreign_links {         Base64(base64::DecodeError);         Utf8Error(str::Utf8Error);     } }  fn main() -> Result&lt;()> {     let hello = b\"hello rustaceans\";     let encoded = STANDARD.encode(hello);     let decoded = STANDARD.decode(&amp;encoded)?;      println!(\"origin: {}\", str::from_utf8(hello)?);     println!(\"base64 encoded: {}\", encoded);     println!(\"back to origin: {}\", str::from_utf8(&amp;decoded)?);      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"102-obrabotka-csv\">10.2. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 CSV<\/h2>\n<p>  <\/p>\n<p><strong>\u0427\u0442\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 CSV<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 CSV \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <a href=\"https:\/\/docs.rs\/csv\/*\/csv\/struct.StringRecord.html\">csv::StringRecord<\/a> \u2014 \u0441\u043b\u0430\u0431\u043e\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 UTF-8. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <a href=\"https:\/\/docs.rs\/csv\/*\/csv\/struct.ByteRecord.html\">ByteRecord<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use csv::Error;  fn main() -> Result&lt;(), Error> {     let csv = \"year,make,model,description 1948,Porsche,356,Luxury sports car 1967,Ford,Mustang fastback 1967,American car\";      let mut reader = csv::Reader::from_reader(csv.as_bytes());     for record in reader.records() {         let record = record?;         println!(             \"In {}, {} built the {} model. It is a {}.\",             &amp;record[0], &amp;record[1], &amp;record[2], &amp;record[3]         );     }      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/csv\/*\/csv\/struct.Reader.html#method.deserialize\">csv::Reader::deserialize<\/a> \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u0442\u0440\u043e\u0433\u043e\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. <em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em> \u043d\u0430 \u044f\u0432\u043d\u0443\u044e \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use serde::Deserialize;  #[derive(Deserialize)] struct Record {     year: u16,     make: String,     model: String,     description: String, }  fn main() -> Result&lt;(), csv::Error> {     let csv = \"year,make,model,description 1948,Porsche,356,Luxury sports car 1967,Ford,Mustang fastback 1967,American car\";      let mut reader = csv::Reader::from_reader(csv.as_bytes());      for record in reader.deserialize() {         \/\/ \u0422\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438         let record: Record = record?;         println!(             \"In {}, {} built the {} model. It is a {}.\",             record.year,             record.make,             record.model,             record.description         );     }      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0427\u0442\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 CSV \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u043c<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0447\u0442\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 CSV, <a href=\"https:\/\/docs.rs\/csv\/1.0.0-beta.3\/csv\/struct.ReaderBuilder.html#method.delimiter\">\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u043c<\/a> \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0430\u0431:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use csv::Error; use serde::Deserialize;  #[derive(Debug, Deserialize)] struct Record {     name: String,     place: String,     #[serde(deserialize_with = \"csv::invalid_option\")]     id: Option&lt;u64>, }  use csv::ReaderBuilder;  fn main() -> Result&lt;(), Error> {     let data = \"name\\tplace\\tid Mark\\tMelbourne\\t46 Ashley\\tZurich\\t92\";      let mut reader = ReaderBuilder::new()         \/\/ \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c         .delimiter(b'\\t')         .from_reader(data.as_bytes());     \/\/ \u0414\u0440\u0443\u0433\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0442\u0438\u043f\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u043f\u0438\u0441\u0438     for result in reader.deserialize::&lt;Record>() {         println!(\"{:?}\", result?);     }      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 CSV, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u0441 \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u043c<\/strong><\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 <code>data<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441 <code>query<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain;  use std::io;  error_chain! {     foreign_links {         Io(std::io::Error);         CsvError(csv::Error);     } }  fn main() -> Result&lt;()> {     let query = \"CA\";     let data = \"\\ City,State,Population,Latitude,Longitude Kenai,AK,7610,60.5544444,-151.2583333 Oakman,AL,,33.7133333,-87.3886111 Sandfort,AL,,32.3380556,-85.2233333 West Hollywood,CA,37031,34.0900000,-118.3608333\";      \/\/ \u0421\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u0447\u0442\u0435\u043d\u0438\u044f CSV     let mut rdr = csv::ReaderBuilder::new().from_reader(data.as_bytes());     \/\/ \u0421\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 stdout (\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b)     let mut wtr = csv::Writer::from_writer(io::stdout());      \/\/ \u041f\u0438\u0448\u0435\u043c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 CSV     wtr.write_record(rdr.headers()?)?;      for result in rdr.records() {         let record = result?;         \/\/ \u041f\u0438\u0448\u0435\u043c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0437\u0430\u043f\u0438\u0441\u044c, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044e \u043f\u043e\u043b\u0435, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0435 \u0441 `query` (`CA`)         if record.iter().any(|field| field == query) {             wtr.write_record(&amp;record)?;         }     }      \/\/ `writer` \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440, \u0441\u043c. \u043d\u0438\u0436\u0435     wtr.flush()?;     Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e serde<\/strong><\/p>\n<p>  <\/p>\n<p>\u0424\u0430\u0439\u043b\u044b CSV \u0447\u0430\u0441\u0442\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0414\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0432 \u043a\u0440\u0435\u0439\u0442 <code>csv<\/code> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440, <a href=\"https:\/\/docs.rs\/csv\/*\/csv\/fn.invalid_option.html\">csv::invalid_option<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f <code>None<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use csv::Error; use serde::Deserialize;  #[derive(Debug, Deserialize)] struct Record {     name: String,     place: String,     #[serde(deserialize_with = \"csv::invalid_option\")]     id: Option&lt;u64>, }  fn main() -> Result&lt;(), Error> {     \/\/ \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 ID     let data = \"name,place,id mark,sydney,46.5 ashley,zurich,92 akshat,delhi,37 alisha,colombo,xyz\";      let mut rdr = csv::Reader::from_reader(data.as_bytes());     for result in rdr.deserialize() {         let record: Record = result?;         \/\/ \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a         \/\/ `Record { name: \"alisha\", place: \"colombo\", id: None }`         println!(\"{:?}\", record);     }      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 CSV<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0440\u0442\u0435\u0436\u0435\u0439 <code>Rust<\/code>. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <a href=\"https:\/\/docs.rs\/csv\/*\/csv\/struct.Writer.html\">csv::writer<\/a> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0442\u0438\u043f\u043e\u0432 <code>Rust<\/code> \u0432 \u0437\u0430\u043f\u0438\u0441\u0438 CSV. \u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/csv\/*\/csv\/struct.Writer.html#method.write_record\">write_record<\/a> \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c\u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u0446\u0435\u043b\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u0447\u0438\u0441\u043b\u0430 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u0438 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/csv\/*\/csv\/struct.Writer.html#method.serialize\">serialize<\/a>. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 (writer) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u044f\u0432\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/csv\/*\/csv\/struct.Writer.html#method.flush\">flush<\/a> \u0434\u043b\u044f \u0435\u0433\u043e \u043e\u0447\u0438\u0441\u0442\u043a\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain;  use std::io;  error_chain! {     foreign_links {         CSVError(csv::Error);         IOError(std::io::Error);    } }  fn main() -> Result&lt;()> {     let mut wtr = csv::Writer::from_writer(io::stdout());      wtr.write_record(&amp;[\"Name\", \"Place\", \"ID\"])?;      wtr.serialize((\"Mark\", \"Sydney\", 87))?;     wtr.serialize((\"Ashley\", \"Dublin\", 32))?;     wtr.serialize((\"Akshat\", \"Delhi\", 11))?;      wtr.flush()?;     Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 CSV \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e serde<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432 \u0437\u0430\u043f\u0438\u0441\u044c CSV \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0440\u0435\u0439\u0442\u0430 <a href=\"https:\/\/docs.rs\/serde\/\">serde<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain; use serde::Serialize; use std::io;  error_chain! {    foreign_links {        IOError(std::io::Error);        CSVError(csv::Error);    } }  #[derive(Serialize)] struct Record&lt;'a> {     name: &amp;'a str,     place: &amp;'a str,     id: u64, }  fn main() -> Result&lt;()> {     let mut wtr = csv::Writer::from_writer(io::stdout());      let rec1 = Record {         name: \"Mark\",         place: \"Melbourne\",         id: 56,     };     let rec2 = Record {         name: \"Ashley\",         place: \"Sydney\",         id: 64,     };     let rec3 = Record {         name: \"Akshat\",         place: \"Delhi\",         id: 98,     };      wtr.serialize(rec1)?;     wtr.serialize(rec2)?;     wtr.serialize(rec3)?;      wtr.flush()?;      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"103-strukturirovannye-dannye\">10.3. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/h2>\n<p>  <\/p>\n<p><strong>\u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e JSON<\/strong><\/p>\n<p>  <\/p>\n<p>\u041a\u0440\u0435\u0439\u0442 <a href=\"https:\/\/docs.serde.rs\/serde_json\/\">serde_json<\/a> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <a href=\"https:\/\/docs.serde.rs\/serde_json\/fn.from_str.html\">from_str<\/a> \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430 <code>&amp;str<\/code> \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JSON.<\/p>\n<p>  <\/p>\n<p>\u041d\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 JSON \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f <a href=\"https:\/\/docs.serde.rs\/serde_json\/enum.Value.html\">serde_json::Value<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 JSON.<\/p>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0437\u0431\u043e\u0440 <code>&amp;str<\/code> JSON. \u041c\u0430\u043a\u0440\u043e\u0441 <a href=\"https:\/\/docs.serde.rs\/serde_json\/macro.json.html\">json!<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use serde_json::json; use serde_json::{Value, Error};  fn main() -> Result&lt;(), Error> {     let j = r#\"{                  \"userid\": 103609,                  \"verified\": true,                  \"access_privileges\": [                    \"user\",                    \"admin\"                  ]                }\"#;      let parsed: Value = serde_json::from_str(j)?;      let expected = json!({         \"userid\": 103609,         \"verified\": true,         \"access_privileges\": [             \"user\",             \"admin\"         ]     });      assert_eq!(parsed, expected);      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0414\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f TOML<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 TOML \u0432 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0435 <a href=\"https:\/\/docs.rs\/toml\/latest\/toml\/value\/enum.Value.html\">toml::Value<\/a>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 TOML:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use toml::{Value, de::Error};  fn main() -> Result&lt;(), Error> {     let toml_content = r#\"           [package]           name = \"your_package\"           version = \"0.1.0\"           authors = [\"You! &lt;you@example.org>\"]            [dependencies]           serde = \"1.0\"           \"#;      let package_info: Value = toml::from_str(toml_content)?;      assert_eq!(package_info[\"dependencies\"][\"serde\"].as_str(), Some(\"1.0\"));     assert_eq!(package_info[\"package\"][\"name\"].as_str(),                Some(\"your_package\"));      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0440\u0435\u0439\u0442 <a href=\"https:\/\/docs.rs\/serde\/\">serde<\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c TOML \u0432 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use serde::Deserialize; use std::collections::HashMap; use toml::de::Error;  #[derive(Deserialize)] struct Config {     package: Package,     dependencies: HashMap&lt;String, String>, }  #[derive(Deserialize)] struct Package {     name: String,     version: String,     authors: Vec&lt;String>, }  fn main() -> Result&lt;(), Error> {     let toml_content = r#\"           [package]           name = \"your_package\"           version = \"0.1.0\"           authors = [\"You! &lt;you@example.org>\"]            [dependencies]           serde = \"1.0\"           \"#;      let package_info: Config = toml::from_str(toml_content)?;      assert_eq!(package_info.package.name, \"your_package\");     assert_eq!(package_info.package.version, \"0.1.0\");     assert_eq!(package_info.package.authors, vec![\"You! &lt;you@example.org>\"]);     assert_eq!(package_info.dependencies[\"serde\"], \"1.0\");      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"11-obrabotka-oshibok\">11. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/h1>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 main<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043a\u0438, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0435\u0439 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0444\u0430\u0439\u043b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/docs.rs\/error-chain\/\">error-chain<\/a>, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0433\u043e \u0434\u043b\u044f <a href=\"https:\/\/doc.rust-lang.org\/book\/second-edition\/ch09-00-error-handling.html\">\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 Rust<\/a>.<\/p>\n<p>  <\/p>\n<p><code>Io(std::io::Error)<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 <a href=\"https:\/\/docs.rs\/error-chain\/*\/error_chain\/#foreign-links\">foreign_links<\/a> \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <a href=\"https:\/\/doc.rust-lang.org\/std\/io\/struct.Error.html\">std::io::Error<\/a> \u0432 \u0442\u0438\u043f, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c <a href=\"https:\/\/docs.rs\/error-chain\/*\/error_chain\/macro.error_chain.html\">error_chain!<\/a> \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u0442\u0440\u0435\u0439\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/error\/trait.Error.html\">Error<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0443\u0442\u0435\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0444\u0430\u0439\u043b\u0430 Unix <code>\/proc\/uptime<\/code> \u0438 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>read_uptime<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0431\u0435\u0437\u043e\u0442\u043a\u0430\u0437\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0443.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain;  use std::fs::File; use std::io::Read;  error_chain!{     foreign_links {         Io(std::io::Error);         ParseInt(std::num::ParseIntError);     } }  fn read_uptime() -> Result&lt;u64> {     let mut uptime = String::new();     File::open(\"\/proc\/uptime\")?.read_to_string(&amp;mut uptime)?;      Ok(uptime         .split('.')         .next()         .ok_or(\"\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435\")?         .parse()?) }  fn main() {     match read_uptime() {         Ok(uptime) => println!(\"\u0412\u0440\u0435\u043c\u044f \u0431\u0435\u0437\u043e\u0442\u043a\u0430\u0437\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b: {} \u0441\u0435\u043a\u0443\u043d\u0434\", uptime),         Err(err) => eprintln!(\"\u041e\u0448\u0438\u0431\u043a\u0430: {}\", err),     }; }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a<\/strong><\/p>\n<p>  <\/p>\n<p>\u041a\u0440\u0435\u0439\u0442 <a href=\"https:\/\/docs.rs\/error-chain\/\">error-chain<\/a> \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u043c <a href=\"https:\/\/docs.rs\/error-chain\/*\/error_chain\/#matching-errors\">\u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/a> \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043e\u0448\u0438\u0431\u043e\u043a, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439. \u0422\u0438\u043f \u043e\u0448\u0438\u0431\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435\u043c <a href=\"https:\/\/docs.rs\/error-chain\/*\/error_chain\/example_generated\/enum.ErrorKind.html\">ErrorKind<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/blocking\/index.html\">reqwest::blocking<\/a> \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0438\u0437 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <code>Rust<\/code>, <a href=\"https:\/\/docs.rs\/reqwest\/\">reqwest<\/a> \u0438 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441 \u043c\u043e\u0433\u0443\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438. \u041c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/error-chain\/*\/error_chain\/#foreign-links\">foreign_links<\/a>. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 <code>ErrorKind<\/code> \u0434\u043b\u044f \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0431\u043b\u043e\u043a <code>errors<\/code> \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <a href=\"https:\/\/docs.rs\/error-chain\/*\/error_chain\/macro.error_chain.html\">error_chain!<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain;  error_chain! {     foreign_links {         Io(std::io::Error);         Reqwest(reqwest::Error);         ParseIntError(std::num::ParseIntError);     }     errors { RandomResponseError(t: String) } }  fn parse_response(response: reqwest::blocking::Response) -> Result&lt;u32> {     let mut body = response.text()?;     body.pop();     body.parse::&lt;u32>()         .chain_err(|| ErrorKind::RandomResponseError(body)) }  fn run() -> Result&lt;()> {     let url =         format!(\"https:\/\/www.random.org\/integers\/?num=1&amp;min=0&amp;max=10&amp;col=1&amp;base=10&amp;format=plain\");     let response = reqwest::blocking::get(&amp;url)?;     let random_value: u32 = parse_response(response)?;     println!(\"\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043c\u0435\u0436\u0434\u0443 0 \u0438 10: {}\", random_value);     Ok(()) }  fn main() {     if let Err(error) = run() {         match *error.kind() {             ErrorKind::Io(_) => println!(\"\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0432\u0432\u043e\u0434\u0430\/\u0432\u044b\u0432\u043e\u0434\u0430: {:?}\", error),             ErrorKind::Reqwest(_) => println!(\"\u041e\u0448\u0438\u0431\u043a\u0430 Reqwest: {:?}\", error),             ErrorKind::ParseIntError(_) => {                 println!(\"\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430: {:?}\", error)             }             ErrorKind::RandomResponseError(_) => println!(\"\u041a\u0430\u0441\u0442\u043e\u043c\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430: {:?}\", error),             _ => println!(\"\u0414\u0440\u0443\u0433\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430: {:?}\", error),         }     } }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u0432\u044b\u0432\u043e\u0434 \u0435\u0435 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438. <a href=\"https:\/\/docs.rs\/error-chain\/*\/error_chain\/index.html#chaining-errors\">chain_err<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0443\u0442\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a. \u0421\u0442\u0435\u043a \u043e\u0448\u0438\u0431\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0441\u043f\u0443\u0442\u0430\u043d (unwound), \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043b\u0443\u0447\u0448\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>256<\/code> \u0432 <code>u8<\/code>. \u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u0435\u0442 (bubble up) \u0438\u0437 <code>serde<\/code> \u0447\u0435\u0440\u0435\u0437 <code>csv<\/code> \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043a\u043e\u0434.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain; use serde::Deserialize;  use std::fmt;  error_chain! {     foreign_links {         Reader(csv::Error);     } }  #[derive(Debug, Deserialize)] struct Rgb {     red: u8,     blue: u8,     green: u8, }  impl Rgb {     fn from_reader(csv_data: &amp;[u8]) -> Result&lt;Rgb> {         let color: Rgb = csv::Reader::from_reader(csv_data)             .deserialize()             .nth(0)             .ok_or(\"\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c CSV\")?             .chain_err(|| \"\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0446\u0432\u0435\u0442 RGB\")?;          Ok(color)     } }  impl fmt::UpperHex for Rgb {     fn fmt(&amp;self, f: &amp;mut fmt::Formatter) -> fmt::Result {         let hexa = u32::from(self.red) &lt;&lt; 16 | u32::from(self.blue) &lt;&lt; 8 | u32::from(self.green);         write!(f, \"{:X}\", hexa)     } }  fn run() -> Result&lt;()> {     let csv = \"red,blue,green 102,256,204\";      let rgb = Rgb::from_reader(csv.as_bytes()).chain_err(|| \"\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 CSV\")?;     println!(\"{:?} \u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435: #{:X}\", rgb, rgb);      Ok(()) }  fn main() {     if let Err(ref errors) = run() {         eprintln!(\"\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043e\u0448\u0438\u0431\u043a\u0438 - \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\");         errors             .iter()             .enumerate()             .for_each(|(index, error)| eprintln!(\"\u2514> {} - {}\", index, error));          if let Some(backtrace) = errors.backtrace() {             eprintln!(\"{:?}\", backtrace);         }          \/\/ \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a:         \/\/ std::process::exit(1);     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0448\u0438\u0431\u043a\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043e\u0448\u0438\u0431\u043a\u0438 - \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u2514> 0 - \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 CSV \u2514> 1 - \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u0446\u0432\u0435\u0442 RGB \u2514> 2 - CSV deserialize error: record 1 (line: 2, byte: 15): field 1: number too large to fit in target type<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 <code>RUST_BACKTRACE=1<\/code> \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 <a href=\"https:\/\/docs.rs\/error-chain\/*\/error_chain\/trait.ChainedError.html#tymethod.backtrace\">\u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438<\/a> \u044d\u0442\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u0438.<\/p>\n<p>  <\/p>\n<h1 id=\"12-faylovaya-sistema\">12. \u0424\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430<\/h1>\n<p>  <\/p>\n<h2 id=\"121-chtenie-i-zapis\">12.1. \u0427\u0442\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c<\/h2>\n<p>  <\/p>\n<p><strong>\u0427\u0442\u0435\u043d\u0438\u0435 \u043b\u0438\u043d\u0438\u0439 \u0441\u0442\u0440\u043e\u043a \u0438\u0437 \u0444\u0430\u0439\u043b\u0430<\/strong><\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0438\u0437 \u0442\u0440\u0435\u0445 \u0441\u0442\u0440\u043e\u043a, \u0432 \u0444\u0430\u0439\u043b, \u0437\u0430\u0442\u0435\u043c \u0447\u0438\u0442\u0430\u0435\u043c \u0435\u0433\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430 <a href=\"https:\/\/doc.rust-lang.org\/std\/io\/struct.Lines.html\">Lines<\/a>, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/doc.rust-lang.org\/std\/io\/trait.BufRead.html#method.lines\">BufRead::lines<\/a>. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <a href=\"https:\/\/doc.rust-lang.org\/std\/fs\/struct.File.html\">File<\/a> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0442\u0440\u0435\u0439\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/io\/trait.Read.html\">Read<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0440\u0435\u0439\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/io\/struct.BufReader.html\">BufReader<\/a>. \u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/doc.rust-lang.org\/std\/fs\/struct.File.html#method.create\">File::create<\/a> \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0437\u0430\u043f\u0438\u0441\u0438, \u0430 \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/doc.rust-lang.org\/std\/fs\/struct.File.html#method.open\">File::open<\/a> \u2014 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::fs::File; use std::io::{Write, BufReader, BufRead, Error};  fn main() -> Result&lt;(), Error> {     let path = \"lines.txt\";      let mut output = File::create(path)?;     write!(output, \"Rust\\n?\\nFun\")?;      let input = File::open(path)?;     let buffered = BufReader::new(input);      for line in buffered.lines() {         println!(\"{}\", line?);     }      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0444\u0430\u0439\u043b\u0430<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <a href=\"https:\/\/docs.rs\/same-file\/*\/same_file\/struct.Handle.html\">same_file::Handle<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0444\u0430\u0439\u043b\u0430 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0444\u0430\u0439\u043b\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use same_file::Handle; use std::fs::File; use std::io::{BufRead, BufReader, Error, ErrorKind}; use std::path::Path;  fn main() -> Result&lt;(), Error> {     let path_to_read = Path::new(\"message.txt\");      let stdout_handle = Handle::stdout()?;     let handle = Handle::from_path(path_to_read)?;      if stdout_handle == handle {         return Err(Error::new(             ErrorKind::Other,             \"\u0412\u044b \u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0438 \u043f\u0438\u0448\u0435\u0442\u0435 \u0432 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0444\u0430\u0439\u043b\",         ));     } else {         let file = File::open(&amp;path_to_read)?;         let file = BufReader::new(file);         for (num, line) in file.lines().enumerate() {             println!(\"{} : {}\", num, line?.to_uppercase());         }     }      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><code>cargo run<\/code> \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430 <code>message.txt<\/code>, \u0430 <code>cargo run >> .\/message.txt<\/code> \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430\u0434 \u043e\u0434\u043d\u0438\u043c \u0444\u0430\u0439\u043b\u043e\u043c.<\/p>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0444\u0430\u0439\u043b\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0430\u0440\u0442\u044b \u043f\u0430\u043c\u044f\u0442\u0438<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u0440\u0442\u0443 \u043f\u0430\u043c\u044f\u0442\u0438 (memory map) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/memmap\/\">memmap<\/a> \u0438 \u0438\u043c\u0438\u0442\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442, \u0430 \u043d\u0435 <a href=\"https:\/\/doc.rust-lang.org\/std\/fs\/struct.File.html#method.seek\">\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f<\/a> \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0444\u0430\u0439\u043b\u0443.<\/p>\n<p>  <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <a href=\"https:\/\/docs.rs\/memmap\/*\/memmap\/struct.Mmap.html#method.map\">Mmap::map<\/a> \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442, \u0447\u0442\u043e \u0444\u0430\u0439\u043b \u0438\u0437 \u043a\u0430\u0440\u0442\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c. \u0418\u043d\u0430\u0447\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Race_condition#File_systems\">\u0433\u043e\u043d\u043a\u0430 \u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u043c\u0438<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use memmap::Mmap; use std::fs::File; use std::io::{Write, Error};  fn main() -> Result&lt;(), Error> {     write!(File::create(\"content.txt\")?, \"My hovercraft is full of eels!\")?;      let file = File::open(\"content.txt\")?;     let map = unsafe { Mmap::map(&amp;file)? };      let random_indexes = [0, 1, 2, 19, 22, 10, 11, 29];     assert_eq!(&amp;map[3..13], b\"hovercraft\");     let random_bytes: Vec&lt;u8> = random_indexes.iter()         .map(|&amp;idx| map[idx])         .collect();     assert_eq!(&amp;random_bytes[..], b\"My loaf!\");     Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"122-obhod-direktorii\">12.2. \u041e\u0431\u0445\u043e\u0434 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438<\/h2>\n<p>  <\/p>\n<p><strong>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 \u0444\u0430\u0439\u043b\u043e\u0432, \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 24 \u0447\u0430\u0441\u043e\u0432<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043f\u0443\u0442\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0430 <a href=\"https:\/\/doc.rust-lang.org\/std\/env\/fn.current_dir.html\">env::current_dir<\/a>, \u0437\u0430\u0442\u0435\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432 <a href=\"https:\/\/doc.rust-lang.org\/std\/fs\/fn.read_dir.html\">fs::read_dir<\/a>, \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c <a href=\"https:\/\/doc.rust-lang.org\/std\/fs\/struct.DirEntry.html#method.path\">DirEntry::path<\/a> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/doc.rust-lang.org\/std\/fs\/struct.Metadata.html\">fs::Metadata<\/a>. <a href=\"https:\/\/doc.rust-lang.org\/std\/fs\/struct.Metadata.html#method.modified\">Metadata::modified<\/a> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <a href=\"https:\/\/doc.rust-lang.org\/std\/time\/struct.SystemTime.html#method.elapsed\">SystemTime::elapsed<\/a> \u2014 \u0432\u0440\u0435\u043c\u044f, \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0435\u0435 \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. <a href=\"https:\/\/doc.rust-lang.org\/std\/time\/struct.Duration.html#method.as_secs\">Duration::as_secs<\/a> \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0441 24 \u0447\u0430\u0441\u0430\u043c\u0438 (24 <em> 60 <\/em> 60). <a href=\"https:\/\/doc.rust-lang.org\/std\/fs\/struct.Metadata.html#method.is_file\">Metadata::is_file<\/a> \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain;  use std::{env, fs};  error_chain! {     foreign_links {         Io(std::io::Error);         SystemTimeError(std::time::SystemTimeError);     } }  fn main() -> Result&lt;()> {     \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e     let current_dir = env::current_dir()?;     println!(         \"\u0424\u0430\u0439\u043b\u044b, \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 24 \u0447\u0430\u0441\u043e\u0432 \u0432 {:?}:\",         current_dir     );      \/\/ \u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438     for entry in fs::read_dir(current_dir)? {         let entry = entry?;         \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438         let path = entry.path();         \/\/ \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438         let metadata = fs::metadata(&amp;path)?;         \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u044b         let last_modified = metadata.modified()?.elapsed()?.as_secs();          \/\/ \u0415\u0441\u043b\u0438 \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0448\u043b\u043e \u043c\u0435\u043d\u044c\u0448\u0435 24 \u0447\u0430\u0441\u043e\u0432 \u0438         \/\/ \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0430\u0439\u043b\u043e\u043c         if last_modified &lt; 24 * 3600 &amp;&amp; metadata.is_file() {             println!(                 \"\u0424\u0430\u0439\u043b: {:?}, \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0448\u043b\u043e {:?} \u0441\u0435\u043a\u0443\u043d\u0434, \u0444\u0430\u0439\u043b \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f: {:?}, \u0440\u0430\u0437\u043c\u0435\u0440: {:?} \u0431\u0430\u0439\u0442\u043e\u0432.\",                 path.file_name().ok_or(\"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\")?,                 last_modified,                 metadata.permissions().readonly(),                 metadata.len(),             );         }     }      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0432<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0444\u0430\u0439\u043b\u043e\u0432, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::collections::HashMap; use walkdir::WalkDir;  fn main() {     let mut filenames = HashMap::new();      \/\/ \u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438     for entry in WalkDir::new(\".\")             .into_iter()             .filter_map(Result::ok)             \/\/ \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438             .filter(|e| !e.file_type().is_dir()) {         \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430         let f_name = String::from(entry.file_name().to_string_lossy());         \/\/ \u0421\u0447\u0435\u0442\u0447\u0438\u043a \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 \u0444\u0430\u0439\u043b\u043e\u0432         let counter = filenames.entry(f_name.clone()).or_insert(0);         *counter += 1;         \/\/ \u0415\u0441\u043b\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f         if *counter == 2 {             println!(\"{}\", f_name);         }     } }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u043e\u043c<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 JSON, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 24 \u0447\u0430\u0441\u043e\u0432. \u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/walkdir\/*\/walkdir\/struct.WalkDir.html#method.follow_links\">follow_links<\/a> \u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f\u043c\u0438 \u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain;  use walkdir::WalkDir;  error_chain! {     foreign_links {         WalkDir(walkdir::Error);         Io(std::io::Error);         SystemTime(std::time::SystemTimeError);     } }  fn main() -> Result&lt;()> {     for entry in WalkDir::new(\".\")             \/\/ \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438             .follow_links(true)             .into_iter()             .filter_map(|e| e.ok()) {         let f_name = entry.file_name().to_string_lossy();         let sec = entry.metadata()?.modified()?;          \/\/ \u0415\u0441\u043b\u0438 \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441 \u0444\u0430\u0439\u043b\u043e\u043c JSON \u0438 \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0435\u0433\u043e         \/\/  \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0448\u043b\u043e \u043c\u0435\u043d\u044c\u0448\u0435 24 \u0447\u0430\u0441\u043e\u0432         if f_name.ends_with(\".json\") &amp;&amp; sec.elapsed()?.as_secs() &lt; 86400 {             println!(\"{}\", f_name);         }     }      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041e\u0431\u0445\u043e\u0434 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u0441 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043e\u043c \u0444\u0430\u0439\u043b\u043e\u0432, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0442\u043e\u0447\u043a\u0438<\/strong><\/p>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/walkdir\/*\/walkdir\/struct.IntoIter.html#method.filter_entry\">filter_entry<\/a> \u0434\u043b\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>is_not_hidden<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u043e\u0433\u043e, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0444\u0430\u0439\u043b \u0438\u043b\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441\u043a\u0440\u044b\u0442\u044b\u043c\u0438 (\u0435\u0441\u043b\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0442\u043e\u0447\u043a\u0438, \u0437\u043d\u0430\u0447\u0438\u0442 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043a\u0440\u044b\u0442\u043e\u0439). <a href=\"https:\/\/doc.rust-lang.org\/std\/iter\/trait.Iterator.html#method.filter\">Iterator::filter<\/a> \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a \u043a\u0430\u0436\u0434\u043e\u0439 <a href=\"https:\/\/docs.rs\/walkdir\/*\/walkdir\/struct.DirEntry.html\">WalkDir::DirEntry<\/a>, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043a\u043e\u043c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043a\u0440\u044b\u0442\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u043a\u0440\u044b\u0442\u043e\u0439 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e <a href=\"https:\/\/docs.rs\/walkdir\/*\/walkdir\/struct.DirEntry.html#method.depth\">WalkDir::depth<\/a> \u0432 <code>is_not_hidden<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use walkdir::{DirEntry, WalkDir};  fn is_not_hidden(entry: &amp;DirEntry) -> bool {     entry         .file_name()         .to_str()         \/\/ \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0435\u0439 \u0438\u043b\u0438 \u0435\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0442\u043e\u0447\u043a\u0438         .map(|s| entry.depth() == 0 || !s.starts_with(\".\"))         .unwrap_or(false) }  fn main() {     WalkDir::new(\".\")         .into_iter()         \/\/ \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0441\u043a\u0440\u044b\u0442\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438         .filter_entry(|e| is_not_hidden(e))         .filter_map(|v| v.ok())         .for_each(|x| println!(\"{}\", x.path().display())); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0433\u043b\u0443\u0431\u0438\u043d\u044b<\/strong><\/p>\n<p>  <\/p>\n<p>\u0413\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0433\u0438\u0431\u043a\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <a href=\"https:\/\/docs.rs\/walkdir\/*\/walkdir\/struct.WalkDir.html#method.min_depth\">WalkDir::min_depth<\/a> \u0438 <a href=\"https:\/\/docs.rs\/walkdir\/*\/walkdir\/struct.WalkDir.html#method.max_depth\">WalkDir::max_depth<\/a>. \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u043e\u0432 \u043d\u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u0435 \u0442\u0440\u0435\u0445 \u043f\u043e\u0434\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439, \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044f \u0444\u0430\u0439\u043b\u044b \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use walkdir::WalkDir;  fn main() {     let total_size = WalkDir::new(\".\")         .min_depth(1)         .max_depth(3)         .into_iter()         .filter_map(|entry| entry.ok())         .filter_map(|entry| entry.metadata().ok())         .filter(|metadata| metadata.is_file())         .fold(0, |acc, m| acc + m.len());      println!(\"\u041e\u0431\u0449\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440: {} \u0431\u0430\u0439\u0442\u043e\u0432.\", total_size); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 PNG<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 PNG \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d <code>**<\/code> \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0435\u0439 \u0438 \u0432\u0441\u0435\u043c\u0438 \u0435\u0435 \u043f\u043e\u0434\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u041f\u0430\u0442\u0442\u0435\u0440\u043d <code>**<\/code> \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043f\u0443\u0442\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>\/media\/**\/*.png<\/code> \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 PNG \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>media<\/code> \u0438 \u0432\u0441\u0435\u0445 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f\u0445.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain;  use glob::glob;  error_chain! {     foreign_links {         Glob(glob::GlobError);         Pattern(glob::PatternError);     } }  fn main() -> Result&lt;()> {     for entry in glob(\"**\/*.png\")? {         println!(\"{}\", entry?.display());     }      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u043e\u0438\u0441\u043a \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 PNG, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u043c, \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>media<\/code>, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u0441 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u043c <code>img_[0-9]*.png<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <a href=\"https:\/\/docs.rs\/glob\/*\/glob\/fn.glob_with.html\">glob_with<\/a> \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <a href=\"https:\/\/docs.rs\/glob\/*\/glob\/struct.MatchOptions.html\">MatchOptions<\/a> \u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 <code>case_sensitive: false<\/code>, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u043e\u0438\u0441\u043a \u043d\u0435\u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f <a href=\"https:\/\/doc.rust-lang.org\/std\/default\/trait.Default.html\">\u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u043c\u0438<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain; use glob::{glob_with, MatchOptions};  error_chain! {     foreign_links {         Glob(glob::GlobError);         Pattern(glob::PatternError);     } }  fn main() -> Result&lt;()> {     let options = MatchOptions {         case_sensitive: false,         ..Default::default()     };      for entry in glob_with(\"\/media\/img_[0-9]*.png\", options)? {         println!(\"{}\", entry?.display());     }      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"13-raznoe\">13. \u0420\u0430\u0437\u043d\u043e\u0435<\/h1>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044f\u0434\u0435\u0440 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">fn main() {     println!(\"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u044f\u0434\u0435\u0440 \u0426\u041f: {}\", num_cpus::get()); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043b\u0435\u043d\u0438\u0432\u043e \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043b\u0435\u043d\u0438\u0432\u043e \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u043c\u043e\u0439 (lazy evaluated) \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043d\u043e\u0439 <a href=\"https:\/\/doc.rust-lang.org\/std\/collections\/struct.HashMap.html\">HashMap<\/a>. <code>HashMap<\/code> \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0437\u0430 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u043e\u0439.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use lazy_static::lazy_static; use std::collections::HashMap;  lazy_static! {     static ref PRIVILEGES: HashMap&lt;&amp;'static str, Vec&lt;&amp;'static str>> = {         let mut map = HashMap::new();         map.insert(\"\u0418\u0433\u043e\u0440\u044c\", vec![\"user\", \"admin\"]);         map.insert(\"\u0410\u043b\u0435\u043a\u0441\", vec![\"user\"]);         map     }; }  fn show_access(name: &amp;str) {     let access = PRIVILEGES.get(name);     println!(\"{}: {:?}\", name, access); }  fn main() {     let access = PRIVILEGES.get(\"\u0418\u0433\u043e\u0440\u044c\");     println!(\"\u0418\u0433\u043e\u0440\u044c: {:?}\", access);      show_access(\"\u0410\u043b\u0435\u043a\u0441\"); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u043c \u043f\u043e\u0440\u0442\u0443<\/strong><\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u043e\u0440\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0434\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043f\u043e\u0440\u0442\u0430 \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 0, <a href=\"https:\/\/doc.rust-lang.org\/std\/net\/struct.SocketAddrV4.html\">SocketAddrV4<\/a> \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::net::{SocketAddrV4, Ipv4Addr, TcpListener}; use std::io::{Read, Error};  fn main() -> Result&lt;(), Error> {     let loopback = Ipv4Addr::new(127, 0, 0, 1);     let socket = SocketAddrV4::new(loopback, 0);     let listener = TcpListener::bind(socket)?;     let port = listener.local_addr()?;     println!(\"Listening on {}, access this port to end the program\", port);     let (mut tcp_stream, addr) = listener.accept()?; \/\/ \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0434\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430     println!(\"Connection received! {:?} is sending data.\", addr);     let mut input = String::new();     let _ = tcp_stream.read_to_string(&amp;mut input)?;     println!(\"{:?} says {}\", addr, input);     Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"14-operacionnaya-sistema\">14. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430<\/h1>\n<p>  <\/p>\n<h2 id=\"141-vneshnyaya-komanda\">14.1. \u0412\u043d\u0435\u0448\u043d\u044f\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430<\/h2>\n<p>  <\/p>\n<p><strong>\u0417\u0430\u043f\u0443\u0441\u043a \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 stdout<\/strong><\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c <code>git log --oneline<\/code> \u043a\u0430\u043a \u0432\u043d\u0435\u0448\u043d\u044e\u044e <a href=\"https:\/\/doc.rust-lang.org\/std\/process\/struct.Command.html\">Command<\/a> \u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0435\u0435 <a href=\"https:\/\/doc.rust-lang.org\/std\/process\/struct.Output.html\">Output<\/a> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/regex\/*\/regex\/struct.Regex.html\">Regex<\/a> \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0445\u0435\u0448\u0430 \u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 5 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain;  use std::process::Command; use regex::Regex;  error_chain!{     foreign_links {         Io(std::io::Error);         Regex(regex::Error);         Utf8(std::string::FromUtf8Error);     } }  #[derive(PartialEq, Default, Clone, Debug)] struct Commit {     hash: String,     message: String, }  fn main() -> Result&lt;()> {     let output = Command::new(\"git\").arg(\"log\").arg(\"--oneline\").output()?;      if !output.status.success() {         error_chain::bail!(\"\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u043e\u0441\u044c \u043a\u043e\u0434\u043e\u043c \u043e\u0448\u0438\u0431\u043a\u0438\");     }      let pattern = Regex::new(r\"(?x)                                ([0-9a-fA-F]+) # \u0445\u0435\u0448 \u043a\u043e\u043c\u043c\u0438\u0442\u0430                                (.*)           # \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u0430\")?;      String::from_utf8(output.stdout)?         .lines()         .filter_map(|line| pattern.captures(line))         .map(|cap| {                  Commit {                      hash: cap[1].to_string(),                      message: cap[2].trim().to_string(),                  }              })         .take(5)         .for_each(|x| println!(\"{:?}\", x));      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>: \u044d\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c GIT (<code>fatal: not a git repository (or any of the parent directories): .git<\/code>), \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u043a\u043e\u043c\u043c\u0438\u0442 (<code>fatal: your current branch 'master' does not have any commits yet<\/code>).<\/p>\n<p>  <\/p>\n<p><strong>\u0417\u0430\u043f\u0443\u0441\u043a \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0435\u0439 stdin \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438<\/strong><\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 <code>python<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u043d\u0435\u0448\u043d\u0435\u0439 <a href=\"https:\/\/doc.rust-lang.org\/std\/process\/struct.Command.html\">Command<\/a> \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0435\u043c\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0417\u0430\u0442\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c <a href=\"https:\/\/doc.rust-lang.org\/std\/process\/struct.Output.html\">Output<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain;  use std::collections::HashSet; use std::io::Write; use std::process::{Command, Stdio};  error_chain!{     errors { CmdError }     foreign_links {         Io(std::io::Error);         Utf8(std::string::FromUtf8Error);     } }  fn main() -> Result&lt;()> {     let mut child = Command::new(\"python\").stdin(Stdio::piped())         .stderr(Stdio::piped())         .stdout(Stdio::piped())         .spawn()?;      child.stdin         .as_mut()         .ok_or(\"stdin \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043d\u0435 \u0431\u044b\u043b \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0447\u0435\u043d\")?         .write_all(b\"import this; copyright(); credits(); exit()\")?;      let output = child.wait_with_output()?;      if output.status.success() {         let raw_output = String::from_utf8(output.stdout)?;         let words = raw_output.split_whitespace()             .map(|s| s.to_lowercase())             .collect::&lt;HashSet&lt;_>>();         println!(\"\u041d\u0430\u0439\u0434\u0435\u043d\u043e {} \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u043e\u0432:\", words.len());         println!(\"{:#?}\", words);         Ok(())     } else {         let err = String::from_utf8(output.stderr)?;         error_chain::bail!(\"\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u043b\u043e\u0441\u044c:\\n {}\", err)     } }<\/code><\/pre>\n<p>  <\/p>\n<p><em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>: \u0434\u043b\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 \u0432\u0430\u0448\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d <a href=\"https:\/\/www.python.org\/downloads\/\">Python<\/a>.<\/p>\n<p>  <\/p>\n<p><strong>\u0417\u0430\u043f\u0443\u0441\u043a \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0435<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 10 \u0441\u0430\u043c\u044b\u0445 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>du -ah . | sort -hr | head -n 10<\/code>, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e.<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/doc.rust-lang.org\/std\/process\/struct.Command.html\">Command<\/a> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u0412\u044b\u0432\u043e\u0434 (output) \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/doc.rust-lang.org\/std\/process\/struct.Stdio.html\">Stdio::piped<\/a> \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u0435\u0434\u043a\u043e\u043c \u0438 \u0440\u0435\u0431\u0435\u043d\u043a\u043e\u043c.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain;  use std::process::{Command, Stdio};  error_chain! {     foreign_links {         Io(std::io::Error);         Utf8(std::string::FromUtf8Error);     } }  fn main() -> Result&lt;()> {     \/\/ \u041f\u0443\u0442\u044c \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438     let directory = std::env::current_dir()?;     \/\/ du -ah .     let mut du_output_child = Command::new(\"du\")         .arg(\"-ah\")         .arg(&amp;directory)         .stdout(Stdio::piped())         .spawn()?;      if let Some(du_output) = du_output_child.stdout.take() {         \/\/ sort -hr         let mut sort_output_child = Command::new(\"sort\")             .arg(\"-hr\")             .stdin(du_output)             .stdout(Stdio::piped())             .spawn()?;          du_output_child.wait()?;          if let Some(sort_output) = sort_output_child.stdout.take() {             \/\/ head -n 10             let head_output_child = Command::new(\"head\")                 .args(&amp;[\"-n\", \"10\"])                 .stdin(sort_output)                 .stdout(Stdio::piped())                 .spawn()?;              let head_stdout = head_output_child.wait_with_output()?;              sort_output_child.wait()?;              println!(                 \"10 \u0441\u0430\u043c\u044b\u0445 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u0432 '{}':\\n{}\",                 directory.display(),                 String::from_utf8(head_stdout.stdout).unwrap()             );         }     }      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>: \u044d\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 <code>Unix<\/code>. \u0412 <code>Windows<\/code> \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>bash -c \"du -ah . | sort -hr | head -n 10\"<\/code>.<\/p>\n<p>  <\/p>\n<p><strong>\u041f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 stdout \u0438 stderr \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0432 \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c (spawn) \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c <code>stdout<\/code> \u0438 <code>stderr<\/code> \u0432 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0444\u0430\u0439\u043b. \u042d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e <a href=\"https:\/\/doc.rust-lang.org\/std\/process\/struct.Stdio.html\">process::Stdio<\/a> \u043f\u0438\u0448\u0435\u0442 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b. <a href=\"https:\/\/doc.rust-lang.org\/std\/fs\/struct.File.html#method.try_clone\">File::try_clone<\/a> \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u0438\u043d \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0434\u043b\u044f <code>stdout<\/code> \u0438 <code>stderr<\/code>. \u042d\u0442\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043e\u0431\u0430 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u043f\u0438\u0448\u0443\u0442 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u0443\u0440\u0441\u043e\u0440\u0430. \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>ls . oops >out.txt 2>&amp;1<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::fs::File; use std::io::Error; use std::process::{Command, Stdio};  fn main() -> Result&lt;(), Error> {     let outputs = File::create(\"out.txt\")?;     let errors = outputs.try_clone()?;      Command::new(\"ls\")         \/\/ \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443         .args(&amp;[\".\", \"oops\"])         .stdout(Stdio::from(outputs))         .stderr(Stdio::from(errors))         .spawn()?         .wait_with_output()?;      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>: \u044d\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 <code>Unix<\/code>. \u0412 <code>Windows<\/code> \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>bash -c \"ls . oops >out.txt 2>&amp;1\"<\/code>.<\/p>\n<p>  <\/p>\n<p><strong>\u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430<\/strong><\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 &#171;\u0417\u0430\u043f\u0443\u0441\u043a \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 stdout&#187; \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0430\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 <a href=\"https:\/\/doc.rust-lang.org\/std\/process\/struct.Command.html\">Command<\/a>. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/doc.rust-lang.org\/std\/process\/struct.Stdio.html\">Stdio::piped<\/a> \u0438 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e (continuously) \u0447\u0438\u0442\u0430\u0435\u043c <code>stdout<\/code> \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 <a href=\"https:\/\/doc.rust-lang.org\/std\/io\/struct.BufReader.html\">BufReader<\/a>. \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>journalctl | grep usb<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::process::{Command, Stdio}; use std::io::{BufRead, BufReader, Error, ErrorKind};  fn main() -> Result&lt;(), Error> {     let stdout = Command::new(\"journalctl\")         .stdout(Stdio::piped())         .spawn()?         .stdout         .ok_or_else(|| Error::new(ErrorKind::Other, \"\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u0442\u044c stdout\"))?;      let reader = BufReader::new(stdout);      reader         .lines()         .filter_map(|line| line.ok())         .filter(|line| line.find(\"usb\").is_some())         .for_each(|line| println!(\"{}\", line));       Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>: \u044d\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 <code>Unix<\/code>. \u0412 <code>Windows<\/code> \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>bash -c \"journalctl | grep usb\"<\/code>.<\/p>\n<p>  <\/p>\n<p><strong>\u0427\u0442\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u044b \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/doc.rust-lang.org\/std\/env\/fn.var.html\">std::env::var<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::env; use std::fs; use std::io::Error;  fn main() -> Result&lt;(), Error> {     \/\/ \u0427\u0438\u0442\u0430\u0435\u043c `config_path` \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f `CONFIG`.     \/\/ \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f `CONFIG` \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u043f\u0443\u0442\u044c     let config_path = env::var(\"CONFIG\")         .unwrap_or(\"\/etc\/myapp\/config\".to_string());      let config: String = fs::read_to_string(config_path)?;     println!(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438: {}\", config);      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432 <code>.env*<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0440\u0435\u0439\u0442 <a href=\"https:\/\/docs.rs\/dotenv\">dotenv<\/a>.<\/p>\n<p>  <\/p>\n<h1 id=\"15-obrabotka-teksta\">15. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430<\/h1>\n<p>  <\/p>\n<h2 id=\"151-regulyarnye-vyrazheniya\">15.1. \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u043d\u0430 \u0438\u0437 \u0430\u0434\u0440\u0435\u0441\u0430 email<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 email \u0438 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u0435\u0442 <code>@<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use lazy_static::lazy_static; use regex::Regex;  \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0438\u043d\u0430 fn extract_login(input: &amp;str) -> Option&lt;&amp;str> {     \/\/ \u041b\u0435\u043d\u0438\u0432\u043e \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 - \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435     lazy_static! {         static ref RE: Regex = Regex::new(r\"(?x)             ^(?P&lt;login>[^@\\s]+)@             ([[:word:]]+\\.)*             [[:word:]]+$             \").unwrap();     }     RE.captures(input).and_then(|cap| {         \/\/ login - \u0437\u0430\u0445\u0432\u0430\u0447\u0435\u043d\u043d\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 (capture group)         cap.name(\"login\").map(|login| login.as_str())     }) }  fn main() {     assert_eq!(extract_login(r\"I\u2764email@example.com\"), Some(r\"I\u2764email\"));     assert_eq!(         extract_login(r\"sdf+sdsfsd.as.sdsd@jhkk.d.rl\"),         Some(r\"sdf+sdsfsd.as.sdsd\")     );     assert_eq!(extract_login(r\"More@Than@One@at.com\"), None);     assert_eq!(extract_login(r\"Not an email@email\"), None); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0445\u0435\u0448\u0442\u0435\u0433\u043e\u0432 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0430<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0445\u0441\u044f \u0445\u0435\u0448\u0442\u0435\u0433\u043e\u0432 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<p>  <\/p>\n<p>\u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0445\u0435\u0448\u0442\u0435\u0433\u0430 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0435 \u0445\u0435\u0448\u0442\u0435\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 \u0431\u0443\u043a\u0432\u044b. \u041f\u043e\u043b\u043d\u0430\u044f <a href=\"https:\/\/github.com\/twitter\/twitter-text\/blob\/c9fc09782efe59af4ee82855768cfaf36273e170\/java\/src\/com\/twitter\/Regex.java#L255\">\u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0445\u0435\u0448\u0442\u0435\u0433\u043e\u0432 Twitter<\/a> \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use lazy_static::lazy_static;  use regex::Regex; use std::collections::HashSet;  \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0445\u0435\u0448\u0442\u0435\u0433\u043e\u0432 fn extract_hashtags(text: &amp;str) -> HashSet&lt;&amp;str> {     \/\/ \u041b\u0435\u043d\u0438\u0432\u043e \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 - \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435     lazy_static! {         static ref RE: Regex = Regex::new(                 r\"\\#[a-zA-Z][0-9a-zA-Z_]*\"             ).unwrap();     }     RE.find_iter(text).map(|mat| mat.as_str()).collect() }  fn main() {     let tweet = \"Hey #world, I just got my new #dog, say hello to Till. #dog #forever #2 #_ \";     let tags = extract_hashtags(tweet);     assert!(tags.contains(\"#dog\") &amp;&amp; tags.contains(\"#forever\") &amp;&amp; tags.contains(\"#world\"));     assert_eq!(tags.len(), 3); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/regex\/*\/regex\/struct.Regex.html#method.captures_iter\">Regex::captures_iter<\/a> \u0434\u043b\u044f \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0430. \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438\u0435 \u043d\u043e\u043c\u0435\u0440\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain;  use regex::Regex; use std::fmt;  error_chain!{     foreign_links {         Regex(regex::Error);         Io(std::io::Error);     } }  struct PhoneNumber&lt;'a> {     area: &amp;'a str,     exchange: &amp;'a str,     subscriber: &amp;'a str, }  impl&lt;'a> fmt::Display for PhoneNumber&lt;'a> {     fn fmt(&amp;self, f: &amp;mut fmt::Formatter) -> fmt::Result {         write!(f, \"1 ({}) {}-{}\", self.area, self.exchange, self.subscriber)     } }  fn main() -> Result&lt;()> {     let phone_text = \"     +1 505 881 9292 (v) +1 505 778 2212 (c) +1 505 881 9297 (f)     (202) 991 9534     Alex 5553920011     1 (800) 233-2010     1.299.339.1020\";      let re = Regex::new(         r#\"(?x)           (?:\\+?1)?                       # \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u0442\u0440\u0430\u043d\u044b           [\\s\\.]?           (([2-9]\\d{2})|\\(([2-9]\\d{2})\\)) # \u043a\u043e\u0434 \u0440\u0435\u0433\u0438\u043e\u043d\u0430           [\\s\\.\\-]?           ([2-9]\\d{2})                    # \u043a\u043e\u0434 \u043e\u0431\u043c\u0435\u043d\u0430           [\\s\\.\\-]?           (\\d{4})                         # \u043a\u043e\u0434 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430\"#,     )?;      let phone_numbers = re.captures_iter(phone_text).filter_map(|cap| {         let groups = (cap.get(2).or(cap.get(3)), cap.get(4), cap.get(5));         match groups {             (Some(area), Some(ext), Some(sub)) => Some(PhoneNumber {                 area: area.as_str(),                 exchange: ext.as_str(),                 subscriber: sub.as_str(),             }),             _ => None,         }     });      assert_eq!(         phone_numbers.map(|m| m.to_string()).collect::&lt;Vec&lt;_>>(),         vec![             \"1 (505) 881-9292\",             \"1 (505) 778-2212\",             \"1 (505) 881-9297\",             \"1 (202) 991-9534\",             \"1 (555) 392-0011\",             \"1 (800) 233-2010\",             \"1 (299) 339-1020\",         ]     );      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0417\u0430\u043c\u0435\u043d\u0430 \u0432\u0441\u0435\u0445 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a \u0432 \u0441\u0442\u0440\u043e\u043a\u0435<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043c\u0435\u043d\u044b \u0432\u0441\u0435\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0434\u0430\u0442 ISO 8601 YYYY-MM-DD \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u0442\u0430\u043c\u0438 \u0432 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u043c \u043d\u0430\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <code>2013-01-15<\/code> \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f <code>15.01.2013<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/regex\/*\/regex\/struct.Regex.html#method.replace_all\">Regex::replace_all<\/a> \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f. <code>&amp;str<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0442\u0440\u0435\u0439\u0442 <code>Replacer<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0432\u0440\u043e\u0434\u0435 <code>$abcde<\/code> \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0445\u0432\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b (<code>?P&lt;abcde>REGEX<\/code>) \u0438\u0437 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438. \u0421\u043c. <a href=\"https:\/\/docs.rs\/regex\/*\/regex\/struct.Regex.html#replacement-string-syntax\">\u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0437\u0430\u043c\u0435\u043d\u044b \u0432 \u0441\u0442\u0440\u043e\u043a\u0435<\/a> \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use lazy_static::lazy_static;  use std::borrow::Cow; use regex::Regex;  \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u0442\u044b fn reformat_dates(before: &amp;str) -> Cow&lt;str> {     \/\/ \u041b\u0435\u043d\u0438\u0432\u043e \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430 - \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435     lazy_static! {         static ref RE : Regex = Regex::new(             r\"(?P&lt;y>\\d{4})-(?P&lt;m>\\d{2})-(?P&lt;d>\\d{2})\"             ).unwrap();     }     RE.replace_all(before, \"$d.$m.$y\") }  fn main() {     let before = \"2012-03-14, 2013-01-15 \u0438 2014-07-05\";     let after = reformat_dates(before);     assert_eq!(after, \"14.03.2012, 15.01.2013 \u0438 05.07.2014\"); }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"153-razbor-stroki\">15.3. \u0420\u0430\u0437\u0431\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0438<\/h2>\n<p>  <\/p>\n<p><strong>\u0421\u0431\u043e\u0440 \u0433\u0440\u0430\u0444\u0435\u043c \u042e\u043d\u0438\u043a\u043e\u0434\u0430<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0433\u0440\u0430\u0444\u0435\u043c\u044b <a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/785668\/\">\u042e\u043d\u0438\u043a\u043e\u0434\u0430<\/a> \u0438\u0437 UTF-8 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/unicode-segmentation\/*\/unicode_segmentation\/trait.UnicodeSegmentation.html#tymethod.graphemes\">UnicodeSegmentation::graphemes<\/a> \u0438\u0437 \u043a\u0440\u0435\u0439\u0442\u0430 <a href=\"https:\/\/docs.rs\/unicode-segmentation\/1.2.1\/unicode_segmentation\/\">unicode-segmentation<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use unicode_segmentation::UnicodeSegmentation;  fn main() {     let name = \"\u0419\u043e\u0433\u0443\u0440\u0442 \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u043b \u043c\u0438\u0440\\r\\n\";     let graphemes = UnicodeSegmentation::graphemes(name, true)         .collect::&lt;Vec&lt;&amp;str>>();     assert_eq!(graphemes[0], \"\u0419\"); }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0440\u0435\u0439\u0442\u0430 FromStr \u0434\u043b\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>RGB<\/code> \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043d\u0430 \u043d\u0435\u0439 \u0442\u0440\u0435\u0439\u0442 <code>FromStr<\/code> \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0446\u0432\u0435\u0442\u0430 HEX \u0432 \u0446\u0432\u0435\u0442 RGB:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use std::str::FromStr;  #[derive(Debug, PartialEq)] struct RGB {     r: u8,     g: u8,     b: u8, }  impl FromStr for RGB {     type Err = std::num::ParseIntError;      \/\/ \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0446\u0432\u0435\u0442 HEX `#rRgGbB` \u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 `RGB`     fn from_str(hex_code: &amp;str) -> Result&lt;Self, Self::Err> {         \/\/ `u8::from_str_radix(src: &amp;str, radix: u32)` \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u0441\u0440\u0435\u0437         \/\/ \u0432 u8 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f         let r: u8 = u8::from_str_radix(&amp;hex_code[1..3], 16)?;         let g: u8 = u8::from_str_radix(&amp;hex_code[3..5], 16)?;         let b: u8 = u8::from_str_radix(&amp;hex_code[5..7], 16)?;          Ok(RGB { r, g, b })     } }  fn main() {     let code = \"#fa7268\";     match RGB::from_str(code) {         Ok(rgb) => {             println!(                 \"The RGB color code is: R: {} G: {} B: {}\",                 rgb.r, rgb.g, rgb.b             );         }         Err(_) => {             println!(\"{} is not a valid color hex code!\", code);         }     }      assert_eq!(         RGB::from_str(&amp;r\"#fa7268\").unwrap(),         RGB {             r: 250,             g: 114,             b: 104         }     ); }<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"16-veb-razrabotka\">16. \u0412\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/h1>\n<p>  <\/p>\n<h2 id=\"161-izvlechenie-ssylok\">16.1. \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a<\/h2>\n<p>  <\/p>\n<p><strong>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u0438\u0437 HTML-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b<\/strong><\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c GET-\u0437\u0430\u043f\u0440\u043e\u0441 HTTP \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/fn.get.html\">reqwest::get<\/a> \u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 HTML \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/select\/*\/select\/document\/struct.Document.html#method.from_read\">Document::from_read<\/a>. <a href=\"https:\/\/docs.rs\/select\/*\/select\/document\/struct.Document.html#method.find\">find<\/a> \u0441 <code>a<\/code> \u0432 <a href=\"https:\/\/docs.rs\/select\/*\/select\/predicate\/struct.Name.html\">Name<\/a> \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0441\u044b\u043b\u043a\u0438. \u0412\u044b\u0437\u043e\u0432 <a href=\"https:\/\/doc.rust-lang.org\/core\/iter\/trait.Iterator.html#method.filter_map\">filter_map<\/a> \u043d\u0430 <a href=\"https:\/\/docs.rs\/select\/*\/select\/selection\/struct.Selection.html\">Selection<\/a> \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 URL \u0438\u0437 \u0441\u0441\u044b\u043b\u043e\u043a, \u0438\u043c\u0435\u044e\u0449\u0438\u0445 <a href=\"https:\/\/docs.rs\/select\/*\/select\/node\/struct.Node.html#method.attr\">attr<\/a> (\u0430\u0442\u0440\u0438\u0431\u0443\u0442) <code>href<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain; use select::document::Document; use select::predicate::Name;  error_chain! {       foreign_links {           ReqError(reqwest::Error);           IoError(std::io::Error);       } }  #[tokio::main] async fn main() -> Result&lt;()> {     \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c GET-\u0437\u0430\u043f\u0440\u043e\u0441     let res = reqwest::get(\"https:\/\/www.rust-lang.org\/en-US\/\")         .await?         \/\/ \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u0432 \u0442\u0435\u043a\u0441\u0442         .text()         .await?;      \/\/ \u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u043e\u0442\u0432\u0435\u0442\u0430     Document::from(res.as_str())         \/\/ \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0441\u0441\u044b\u043b\u043a\u0438         .find(Name(\"a\"))         \/\/ \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0438 \u0431\u0435\u0437 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 `href`         .filter_map(|n| n.attr(\"href\"))         .for_each(|x| println!(\"{}\", x));    Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u043e\u0438\u0441\u043a \u0441\u043b\u043e\u043c\u0430\u043d\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u0432\u0435\u0431-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435<\/strong><\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c <code>get_base_url<\/code> \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL. \u0415\u0441\u043b\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0438\u043c\u0435\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0442\u0435\u0433, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437 \u043d\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <a href=\"https:\/\/docs.rs\/select\/*\/select\/node\/struct.Node.html#method.attr\">attr<\/a> (\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430) <code>href<\/code>. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/docs.rs\/url\/*\/url\/enum.Position.html#variant.BeforePath\">Position::BeforePath<\/a> \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e URL.<\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/tokio\/*\/tokio\/fn.spawn.html\">tokio::spawn<\/a> \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/url\/*\/url\/struct.ParseOptions.html\">url::ParseOptions<\/a> \u0438 <a href=\"https:\/\/docs.rs\/url\/*\/url\/struct.Url.html#method.parse\">Url::parse<\/a>. \u0417\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/reqwest\/\">reqwest<\/a> \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.StatusCode.html\">StatusCode<\/a> \u043e\u0442\u0432\u0435\u0442\u0430. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 <code>await<\/code> (\u043e\u0436\u0438\u0434\u0430\u0435\u0442) \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain; use reqwest::StatusCode; use select::document::Document; use select::predicate::Name; use std::collections::HashSet; use url::{Position, Url};  error_chain! {   foreign_links {       ReqError(reqwest::Error);       IoError(std::io::Error);       UrlParseError(url::ParseError);       JoinError(tokio::task::JoinError);   } }  \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL async fn get_base_url(url: &amp;Url, doc: &amp;Document) -> Result&lt;Url> {   let base_tag_href = doc.find(Name(\"base\")).filter_map(|n| n.attr(\"href\")).nth(0);   let base_url =     base_tag_href.map_or_else(|| Url::parse(&amp;url[..Position::BeforePath]), Url::parse)?;   Ok(base_url) }  \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0441\u044b\u043b\u043a\u0438 async fn check_link(url: &amp;Url) -> Result&lt;bool> {   let res = reqwest::get(url.as_ref()).await?;   \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (\u043e\u0448\u0438\u0431\u043a\u0430 404)   Ok(res.status() != StatusCode::NOT_FOUND) }  #[tokio::main] async fn main() -> Result&lt;()> {   let url = Url::parse(\"https:\/\/www.rust-lang.org\/en-US\/\")?;   let res = reqwest::get(url.as_ref()).await?.text().await?;   let document = Document::from(res.as_str());   let base_url = get_base_url(&amp;url, &amp;document).await?;   let base_parser = Url::options().base_url(Some(&amp;base_url));   let links: HashSet&lt;Url> = document     .find(Name(\"a\"))     .filter_map(|n| n.attr(\"href\"))     .filter_map(|link| base_parser.parse(link).ok())     .collect();     let mut tasks = vec![];      for link in links {         tasks.push(tokio::spawn(async move {             if check_link(&amp;link).await.unwrap() {                 println!(\"\u0421\u0441\u044b\u043b\u043a\u0430 `{}` \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435\", link);             } else {                 println!(\"\u0421\u0441\u044b\u043b\u043a\u0430 `{}` \u0441\u043b\u043e\u043c\u0430\u043d\u0430\", link);             }         }));     }      for task in tasks {         task.await?     }    Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u0438\u0437 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0438 MediaWiki<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 MediaWiki \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/fn.get.html\">reqwest::get<\/a> \u0438 \u0438\u0449\u0435\u043c \u0432\u0441\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/regex\/*\/regex\/struct.Regex.html#method.captures_iter\">Regex::captures_iter<\/a>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <a href=\"https:\/\/doc.rust-lang.org\/std\/borrow\/enum.Cow.html\">Cow<\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0447\u0440\u0435\u0437\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f (allocation) <a href=\"https:\/\/doc.rust-lang.org\/std\/string\/struct.String.html\">String<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 MediaWiki \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/www.mediawiki.org\/wiki\/Help:Links\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use lazy_static::lazy_static; use regex::Regex; use std::borrow::Cow; use std::collections::HashSet; use std::error::Error;  \/\/ \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u0441\u044b\u043b\u043e\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f fn extract_links(content: &amp;str) -> HashSet&lt;Cow&lt;str>> {   lazy_static! {     static ref WIKI_REGEX: Regex = Regex::new(         r\"(?x)             \\[\\[(?P&lt;internal>[^\\[\\]|]*)[^\\[\\]]*\\]\\]    # \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438             |             (url=|URL\\||\\[)(?P&lt;external>http.*?)[ \\|}] # \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438         \"     )     .unwrap();   }    let links: HashSet&lt;_> = WIKI_REGEX     \/\/ \u0438\u0449\u0435\u043c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435     .captures_iter(content)     \/\/ \u0438\u0449\u0435\u043c \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c-\u043a\u043e\u0440\u0442\u0435\u0436\u0435\u043c     .map(|c| match (c.name(\"internal\"), c.name(\"external\")) {       (Some(val), None) => Cow::from(val.as_str().to_lowercase()),       (None, Some(val)) => Cow::from(val.as_str()),       _ => unreachable!(),     })     .collect();    links }  #[tokio::main] async fn main() -> Result&lt;(), Box&lt;dyn Error>> {   let content = reqwest::get(     \"https:\/\/en.wikipedia.org\/w\/index.php?title=Rust_(programming_language)&amp;action=raw\",   )   .await?   .text()   .await?;    println!(\"{:#?}\", extract_links(content.as_str()));    Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"162-url\">16.2. URL<\/h2>\n<p>  <\/p>\n<p><strong>\u0420\u0430\u0437\u0431\u043e\u0440 URL \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0438\u043f Url<\/strong><\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/url\/*\/url\/struct.Url.html#method.parse\">parse<\/a> \u043a\u0440\u0435\u0439\u0442\u0430 <a href=\"https:\/\/docs.rs\/url\/\">url<\/a> \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 <code>&amp;str<\/code> \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <a href=\"https:\/\/docs.rs\/url\/*\/url\/struct.Url.html\">Url<\/a>. \u0421\u0442\u0440\u043e\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 <code>parse<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>Result&lt;Url, ParseError><\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use url::{Url, ParseError};  fn main() -> Result&lt;(), ParseError> {     let s = \"https:\/\/github.com\/rust-lang\/rust\/issues?labels=E-easy&amp;state=open\";      let parsed = Url::parse(s)?;     println!(\"\u041f\u0443\u0442\u044c URL: {}\", parsed.path());     \/\/ \u041f\u0443\u0442\u044c URL: \/rust-lang\/rust\/issues      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL \u043f\u0443\u0442\u0435\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0443\u0442\u0438<\/strong><\/p>\n<p>  <\/p>\n<p>\u0411\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0438 \u0434\u043e\u043c\u0435\u043d. \u0422\u0430\u043a\u0438\u0435 URL \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439, \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0441\u0442\u0440\u043e\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (query string). \u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/url\/*\/url\/struct.PathSegmentsMut.html#method.clear\">PathSegmentsMut::clear<\/a> \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u0443\u0442\u0438, \u0430 \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/url\/*\/url\/struct.Url.html#method.set_query\">Url::set_query<\/a> \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain; use url::Url;  error_chain! {     foreign_links {         UrlParse(url::ParseError);     }     errors {         CannotBeABase     } }  fn main() -> Result&lt;()> {     let full = \"https:\/\/github.com\/rust-lang\/cargo?asdf\";      let url = Url::parse(full)?;     let base = base_url(url)?;      println!(\"\u0411\u0430\u0437\u043e\u0432\u044b\u0439 URL: {}\", base);     \/\/ \u0411\u0430\u0437\u043e\u0432\u044b\u0439 URL: https:\/\/github.com\/      Ok(()) }  fn base_url(mut url: Url) -> Result&lt;Url> {     match url.path_segments_mut() {         Ok(mut path) => {             path.clear();         }         Err(_) => {             return Err(Error::from_kind(ErrorKind::CannotBeABase));         }     }      url.set_query(None);      Ok(url) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 URL \u0438\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e<\/strong><\/p>\n<p>  <\/p>\n<p>\u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/url\/*\/url\/struct.Url.html#method.join\">join<\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 URL \u0438\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0435\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use url::{Url, ParseError};  fn main() -> Result&lt;(), ParseError> {     let path = \"\/rust-lang\/cargo\";      let gh = build_github_url(path)?;      println!(\"\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0439 URL: {}\", gh);     \/\/ \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0439 URL: https:\/\/github.com\/rust-lang\/cargo      Ok(()) }  fn build_github_url(path: &amp;str) -> Result&lt;Url, ParseError> {     const GITHUB: &amp;'static str = \"https:\/\/github.com\";      let base = Url::parse(GITHUB)?;     let joined = base.join(path)?;      Ok(joined) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 (\u0441\u0445\u0435\u043c\u0430 \/ \u0445\u043e\u0441\u0442 \/ \u043f\u043e\u0440\u0442)<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <a href=\"https:\/\/docs.rs\/url\/*\/url\/struct.Url.html\">Url<\/a> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 URL, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use url::{Url, Host, ParseError};  fn main() -> Result&lt;(), ParseError> {     let s = \"ftp:\/\/rust-lang.org\/examples\";      let url = Url::parse(s)?;      assert_eq!(url.scheme(), \"ftp\");     assert_eq!(url.host(), Some(Host::Domain(\"rust-lang.org\")));     assert_eq!(url.port_or_known_default(), Some(21));      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/url\/*\/url\/struct.Url.html#method.origin\">origin<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain; use url::{Url, Origin, Host};  error_chain! {     foreign_links {         UrlParse(url::ParseError);     } }  fn main() -> Result&lt;()> {     let s = \"ftp:\/\/rust-lang.org\/examples\";      let url = Url::parse(s)?;      let expected_scheme = \"ftp\".to_owned();     let expected_host = Host::Domain(\"rust-lang.org\".to_owned());     let expected_port = 21;     let expected = Origin::Tuple(expected_scheme, expected_host, expected_port);      let origin = url.origin();     assert_eq!(origin, expected);      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u0430\u0440 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0437 URL<\/strong><\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <a href=\"https:\/\/docs.rs\/url\/*\/url\/struct.Url.html\">Url<\/a> \u0438 \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u043c URL \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/url\/*\/url\/enum.Position.html\">url::Position<\/a> \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0448\u043d\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use url::{Url, Position, ParseError};  fn main() -> Result&lt;(), ParseError> {     let parsed = Url::parse(\"https:\/\/github.com\/rust-lang\/rust\/issues?labels=E-easy&amp;state=open\")?;     let cleaned: &amp;str = &amp;parsed[..Position::AfterPath];     println!(\"\u041e\u0447\u0438\u0449\u0435\u043d\u043d\u044b\u0439 URL: {}\", cleaned);     \/\/ \u041e\u0447\u0438\u0449\u0435\u043d\u043d\u044b\u0439 URL: https:\/\/github.com\/rust-lang\/rust\/issues     Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"163-tipy-media\">16.3. \u0422\u0438\u043f\u044b \u043c\u0435\u0434\u0438\u0430<\/h2>\n<p>  <\/p>\n<p><strong>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 MIME-\u0442\u0438\u043f\u0430 \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0437\u0431\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0438\u043f <a href=\"https:\/\/docs.rs\/mime\/*\/mime\/struct.Mime.html\">MIME<\/a> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0440\u0435\u0439\u0442\u0430 <a href=\"https:\/\/docs.rs\/mime\/\">mime<\/a>. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <a href=\"https:\/\/docs.rs\/mime\/*\/mime\/struct.FromStrError.html\">FromStrError<\/a> \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 <a href=\"https:\/\/developer.mozilla.org\/ru\/docs\/Glossary\/MIME_type\">MIME-\u0442\u0438\u043f<\/a> \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>unwrap_or<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use mime::{Mime, APPLICATION_OCTET_STREAM};  fn main() {     let invalid_mime_type = \"i n v a l i d\";     \/\/ \u0414\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 [MIME-\u0442\u0438\u043f]     let default_mime = invalid_mime_type         .parse::&lt;Mime>()         .unwrap_or(APPLICATION_OCTET_STREAM);      println!(         \"MIME \u0434\u043b\u044f {:?} - \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 {:?}\",         invalid_mime_type, default_mime     );     \/\/ MIME \u0434\u043b\u044f \"i n v a l i d\" - \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \"application\/octet-stream\"      let valid_mime_type = \"TEXT\/PLAIN\";     let parsed_mime = valid_mime_type         .parse::&lt;Mime>()         .unwrap_or(APPLICATION_OCTET_STREAM);      println!(         \"MIME \u0434\u043b\u044f {:?} \u0431\u044b\u043b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d \u043a\u0430\u043a {:?}\",         valid_mime_type, parsed_mime     );     \/\/ MIME \u0434\u043b\u044f \"TEXT\/PLAIN\" \u0431\u044b\u043b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d \u043a\u0430\u043a \"text\/plain\" }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 MIME-\u0442\u0438\u043f\u0430 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e MIME-\u0442\u0438\u043f\u0430 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0440\u0435\u0439\u0442\u0430 <a href=\"https:\/\/docs.rs\/mime\/\">mime<\/a>. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0438 \u0438\u0449\u0435\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <a href=\"https:\/\/docs.rs\/mime\/*\/mime\/struct.Mime.html\">mime::Mime<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use mime::Mime;  fn find_mimetype (filename : &amp;String) -> Mime {     \/\/  \u0420\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u043d\u0430 \u0447\u0430\u0441\u0442\u0438 \u043f\u043e \u0442\u043e\u0447\u043a\u0435     let parts : Vec&lt;&amp;str> = filename.split('.').collect();      \/\/ \u0418\u0449\u0435\u043c \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 - \u0435\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c     let res = match parts.last() {             Some(v) =>                 match *v {                     \"png\" => mime::IMAGE_PNG,                     \"jpg\" => mime::IMAGE_JPEG,                     \"json\" => mime::APPLICATION_JSON,                     _ => mime::TEXT_PLAIN,                 },             None => mime::TEXT_PLAIN,         };      return res; }  fn main() {     let filenames = vec!(\"foobar.jpg\", \"foo.bar\", \"foobar.png\");     for file in filenames {         let mime = find_mimetype(&amp;file.to_owned());         println!(\"MIME \u0434\u043b\u044f {}: {}\", file, mime);      } }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 MIME-\u0442\u0438\u043f\u0430 \u0438\u0437 \u043e\u0442\u0432\u0435\u0442\u0430 HTTP<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 HTTP \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/reqwest\">reqwest<\/a> MIME-\u0442\u0438\u043f \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 <a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/HTTP\/Headers\/Content-Type\">Content-Type<\/a>. \u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/header\/struct.HeaderMap.html#method.get\">reqwest::header::HeaderMap::get<\/a> \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043a\u0430\u043a <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/header\/struct.HeaderValue.html\">reqwest::header::HeaderValue<\/a>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u0441\u0442\u0440\u043e\u043a\u0443. \u041a\u0440\u0435\u0439\u0442 <a href=\"https:\/\/docs.rs\/mime\/*\/mime\/struct.Mime.html\">mime<\/a> \u0437\u0430\u0442\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <a href=\"https:\/\/docs.rs\/mime\/*\/mime\/struct.Mime.html\">mime::Mime<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041a\u0440\u0435\u0439\u0442 <code>mime<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 MIME-\u0442\u0438\u043f\u044b.<\/p>\n<p>  <\/p>\n<p><em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>, \u0447\u0442\u043e \u043c\u043e\u0434\u0443\u043b\u044c <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/header\/index.html\">reqwest::header<\/a> \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 \u043a\u0440\u0435\u0439\u0442\u0430 <a href=\"https:\/\/docs.rs\/http\/*\/http\/\">http<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain; use mime::Mime; use std::str::FromStr; use reqwest::header::CONTENT_TYPE;  error_chain! {     foreign_links {         Reqwest(reqwest::Error);         Header(reqwest::header::ToStrError);         Mime(mime::FromStrError);     } }  #[tokio::main] async fn main() -> Result&lt;()> {     let response = reqwest::get(\"https:\/\/www.rust-lang.org\/logos\/rust-logo-32x32.png\").await?;     \/\/ \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438\u0437 \u043e\u0442\u0432\u0435\u0442\u0430     let headers = response.headers();      match headers.get(CONTENT_TYPE) {         None => {             println!(\"\u041e\u0442\u0432\u0435\u0442 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0434\u0438\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 `Content-Type`\");         }         Some(content_type) => {             let content_type = Mime::from_str(content_type.to_str()?)?;             let media_type = match (content_type.type_(), content_type.subtype()) {                 (mime::TEXT, mime::HTML) => \"\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 HTML\",                 (mime::TEXT, _) => \"\u0442\u0435\u043a\u0441\u0442\",                 (mime::IMAGE, mime::PNG) => \"\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 PNG\",                 (mime::IMAGE, _) => \"\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\",                 _ => \"\u043d\u0435 \u0442\u0435\u043a\u0441\u0442 \u0438 \u043d\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\",             };              println!(\"\u041e\u0442\u0432\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 {}\", media_type);             \/\/ \u041e\u0442\u0432\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 PNG         }     };      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"163-klienty\">16.3. \u041a\u043b\u0438\u0435\u043d\u0442\u044b<\/h2>\n<p>  <\/p>\n<p><strong>\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 HTTP<\/strong><\/p>\n<p>  <\/p>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 GET-\u0437\u0430\u043f\u0440\u043e\u0441 HTTP \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/blocking\/fn.get.html\">reqwest::blocking::get<\/a>, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/blocking\/struct.Response.html\">reqwest::blocking::Response<\/a>, \u0447\u0438\u0442\u0430\u0435\u043c \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 <code>String<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/doc.rust-lang.org\/std\/io\/trait.Read.html#method.read_to_string\">read_to_string<\/a>, \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain; use std::io::Read;  error_chain! {     foreign_links {         Io(std::io::Error);         HttpRequest(reqwest::Error);     } }  fn main() -> Result&lt;()> {     \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442     let mut res = reqwest::blocking::get(\"http:\/\/httpbin.org\/get\")?;     let mut body = String::new();     \/\/ \u0427\u0438\u0442\u0430\u0435\u043c \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443     res.read_to_string(&amp;mut body)?;      println!(\"\u0421\u0442\u0430\u0442\u0443\u0441: {}\", res.status());     println!(\"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438:\\n{:#?}\", res.headers());     println!(\"\u0422\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430:\\n{}\", body);      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>Async<\/strong><\/p>\n<p>  <\/p>\n<p>\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043a\u0440\u0435\u0439\u0442\u0430 <a href=\"https:\/\/tokio.rs\/\">tokio<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain;  error_chain! {     foreign_links {         Io(std::io::Error);         HttpRequest(reqwest::Error);     } }  #[tokio::main] async fn main() -> Result&lt;()> {     let res = reqwest::get(\"http:\/\/httpbin.org\/get\").await?;     println!(\"\u0421\u0442\u0430\u0442\u0443\u0441: {}\", res.status());     println!(\"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438:\\n{:#?}\", res.headers());      \/\/ \u0427\u0438\u0442\u0430\u0435\u043c \u0442\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442     let body = res.text().await?;     println!(\"\u0422\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430:\\n{}\", body);     Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a GitHub API<\/strong><\/p>\n<p>  <\/p>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a <a href=\"https:\/\/developer.github.com\/v3\/activity\/starring\/#list-stargazers\">stargazers API v3<\/a> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/fn.get.html\">reqwest::get<\/a> \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0432\u0448\u0438\u0445 \u0437\u0432\u0435\u0437\u0434\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443 GitHub. \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.Response.html\">reqwest::Response<\/a> \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>User<\/code>, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0443\u044e \u0442\u0440\u0435\u0439\u0442 <a href=\"https:\/\/docs.rs\/serde\/*\/serde\/trait.Deserialize.html\">serde::Deserialize<\/a>.<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/docs.rs\/tokio\/latest\/tokio\/attr.main.html\">tokio::main<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f (executor). \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0436\u0434\u0435\u0442 (<code>await<\/code>) \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u0435\u0440\u0435\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use reqwest::{header::USER_AGENT, Error}; use serde::Deserialize;  #[derive(Deserialize, Debug)] struct User {     login: String,     id: u32, }  #[tokio::main] async fn main() -> Result&lt;(), Error> {     \/\/ \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c URL     let request_url = format!(         \"https:\/\/api.github.com\/repos\/{owner}\/{repo}\/stargazers\",         owner = \"harryheman\",         repo = \"my-js\"     );     println!(\"{}\", request_url);      let client = reqwest::Client::new();     \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441     let response = client         .get(request_url)         \/\/ \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a         .header(USER_AGENT, \"\")         .send()         .await?;      \/\/ \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JSON \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u044b `User`     let users: Vec&lt;User> = response.json().await?;     println!(\"{:?}\", users);     Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u0430 API<\/strong><\/p>\n<p>  <\/p>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c HEAD-\u0437\u0430\u043f\u0440\u043e\u0441 HTTP (<a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.Client.html#method.head\">Client::head<\/a>) \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 GitHub \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0443\u0441\u043f\u0435\u0445 \u043f\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0443 \u043e\u0442\u0432\u0435\u0442\u0430. \u0422\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u0431\u0435\u0437 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u0435\u043b\u0430 \u043e\u0442\u0432\u0435\u0442\u0430. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.Client.html\">reqwest::Client<\/a> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.ClientBuilder.html#method.timeout\">ClientBuilder::timeout<\/a> \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u0435\u0441\u043b\u0438 \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u043b\u044c\u0448\u0435 5 \u0441\u0435\u043a\u0443\u043d\u0434.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u0435\u0442\u043e\u0434\u044b <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.ClientBuilder.html#method.build\">ClientBuilder::build<\/a> \u0438 <a href=\"https:\/\/docs.rs\/reqwest\/latest\/reqwest\/struct.RequestBuilder.html#method.send\">ReqwestBuilder::send<\/a> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u0442\u0438\u043f\u044b <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.Error.html\">reqwest::Error<\/a>, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0438\u043f\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code>main<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/type.Result.html\">reqwest::Result<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use reqwest::header::USER_AGENT; use reqwest::ClientBuilder; use reqwest::Result; use std::time::Duration;  #[tokio::main] async fn main() -> Result&lt;()> {     \/\/ \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f     let user = \"harryheman\";     \/\/ \u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430     let request_url = format!(\"https:\/\/api.github.com\/users\/{}\", user);     println!(\"{}\", request_url);      \/\/ \u0422\u0430\u0439\u043c\u0430\u0443\u0442, \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f     let timeout = Duration::new(5, 0);     \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0438\u0435\u043d\u0442\u0430     let client = ClientBuilder::new().timeout(timeout).build()?;     \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c HEAD-\u0437\u0430\u043f\u0440\u043e\u0441     let response = client         .head(&amp;request_url)         \/\/ \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a         .header(USER_AGENT, \"\")         .send()         .await?;      \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0443\u0441\u043f\u0435\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0443 \u043e\u0442\u0432\u0435\u0442\u0430 (200 \u041e\u041a)     if response.status().is_success() {         println!(\"{} \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c\", user);     } else {         println!(\"{} \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c\", user);     }      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 Gist \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e GitHub API<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c gist \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e POST-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 HTTP (<a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.Client.html#method.post\">Client::post<\/a>) \u043a <a href=\"https:\/\/developer.github.com\/v3\/gists\/\">gists API v3<\/a> \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e DELETE-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 (<a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.Client.html#method.delete\">Client::delete<\/a>).<\/p>\n<p>  <\/p>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.Client.html\">reqwest::Client<\/a> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044f URL, \u0442\u0435\u043b\u043e \u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e. \u0422\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JSON \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u043a\u0440\u043e\u0441\u0430 <a href=\"https:\/\/docs.rs\/serde_json\/*\/serde_json\/macro.json.html\">serde_json::json!<\/a>. \u041e\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.RequestBuilder.html#method.json\">RequestBuilder::json<\/a>. \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/reqwest\/0.11.24\/reqwest\/struct.RequestBuilder.html#method.header\">RequestBuilder::header<\/a>. \u041c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.RequestBuilder.html#method.send\">RequestBuilder::send<\/a> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 GitHub API \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c <a href=\"https:\/\/github.com\/settings\/tokens\">\u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430<\/a> (\u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0433\u0430\u043b\u043e\u0447\u043a\u0443 <code>gist<\/code>), \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0444\u0430\u0439\u043b <code>.env<\/code> \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (<code>GH_TOKEN=ghp_...<\/code>). \u0414\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0441\u0440\u0435\u0434\u044b \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0440\u0435\u0439\u0442 <a href=\"https:\/\/docs.rs\/dotenv\">dotenv<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use dotenv::dotenv; use error_chain::error_chain; use reqwest::{     header::{AUTHORIZATION, USER_AGENT},     Client, }; use serde::Deserialize; use serde_json::json; use std::env;  error_chain! {     foreign_links {         EnvVar(env::VarError);         HttpRequest(reqwest::Error);     } }  #[derive(Deserialize, Debug)] struct Gist {     id: String,     html_url: String, }  #[tokio::main] async fn main() -> Result&lt;()> {     \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 `.env`,     \/\/ \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438     dotenv().ok();      \/\/ \u0422\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430     let gist_body = json!({         \"description\": \"\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 gist\",         \"public\": true,         \"files\": {             \"main.rs\": {             \"content\": r#\"fn main() { println!(\"\u0432\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!\");}\"#             }     }});      \/\/ \u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430     let request_url = \"https:\/\/api.github.com\/gists\";     \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c POST-\u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 gist     let response = Client::new()         .post(request_url)         \/\/ \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a         .header(USER_AGENT, \"\")         \/\/ \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438         .header(AUTHORIZATION, format!(\"Bearer {}\", env::var(\"GH_TOKEN\")?))         \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0435\u043b\u043e         .json(&amp;gist_body)         .send()         .await?;      if response.status().is_success() {         let gist: Gist = response.json().await?;         println!(\"\u0421\u043e\u0437\u0434\u0430\u043d {:?}\", gist);          \/\/ \u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430         let request_url = format!(\"{}\/{}\", request_url, gist.id);         \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c DELETE-\u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 gist         let response = Client::new()             .delete(&amp;request_url)             \/\/ \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a             .header(USER_AGENT, \"\")             \/\/ \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438             .header(AUTHORIZATION, format!(\"Bearer {}\", env::var(\"GH_TOKEN\")?))             .send()             .await?;          if response.status().is_success() {             println!(                 \"Gist {} \u0443\u0434\u0430\u043b\u0435\u043d. \u0421\u0442\u0430\u0442\u0443\u0441-\u043a\u043e\u0434: {}\",                 gist.id,                 response.status()             );         } else {             println!(\"\u0417\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u043b\u0441\u044f. \u0421\u0442\u0430\u0442\u0443\u0441-\u043a\u043e\u0434: {}\", response.status());         }     } else {         println!(\"\u0417\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u043b\u0441\u044f. \u0421\u0442\u0430\u0442\u0443\u0441-\u043a\u043e\u0434: {}\", response.status());     }      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <a href=\"https:\/\/docs.rs\/tempfile\/*\/tempfile\/struct.Builder.html\">tempfile::Builder<\/a> \u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0432 \u043d\u0435\u0435 \u0444\u0430\u0439\u043b \u0447\u0435\u0440\u0435\u0437 HTTP \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/fn.get.html\">reqwest::get<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 <a href=\"https:\/\/doc.rust-lang.org\/std\/fs\/struct.File.html\">File<\/a> \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c, \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u043c \u0438\u0437 <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.Response.html#method.url\">Response::url<\/a>, \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/docs.rs\/tempfile\/3.1.0\/tempfile\/struct.Builder.html#method.tempdir\">tempdir<\/a>, \u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432 \u043d\u0435\u0435 \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <a href=\"https:\/\/doc.rust-lang.org\/std\/io\/fn.copy.html\">io::copy<\/a>. \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain; use std::fs::File; use std::io::copy; use tempfile::Builder;  error_chain! {      foreign_links {          Io(std::io::Error);          HttpRequest(reqwest::Error);      } }  #[tokio::main] async fn main() -> Result&lt;()> {     \/\/ \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f     let tmp_dir = Builder::new().prefix(\"example\").tempdir()?;     \/\/ \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0444\u0430\u0439\u043b     let target = \"https:\/\/www.rust-lang.org\/logos\/rust-logo-512x512.png\";     \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441     let response = reqwest::get(target).await?;      let mut dest = {         let fname = response             .url()             .path_segments()             .and_then(|segments| segments.last())             .and_then(|name| if name.is_empty() { None } else { Some(name) })             .unwrap_or(\"tmp.bin\");         \/\/ \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0444\u0430\u0439\u043b\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0443\u0442\u0438 \u0438\u043b\u0438 `tmp.bin`         println!(\"\u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f: '{}'\", fname);         let fname = tmp_dir.path().join(fname);         \/\/ \u041f\u0443\u0442\u044c \u043a \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 + \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430         println!(\"\u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432: '{:?}'\", fname);         \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u0430         File::create(fname)?     };     \/\/ \u0427\u0438\u0442\u0430\u0435\u043c \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442     let content = response.text().await?;     \/\/ \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432 \u0444\u0430\u0439\u043b     copy(&amp;mut content.as_bytes(), &amp;mut dest)?;     \/\/ \u0424\u0430\u0439\u043b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 5 \u0441\u0435\u043a\u0443\u043d\u0434,     \/\/ \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u0441\u044f     std::thread::sleep(std::time::Duration::from_secs(5));     Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0444\u0430\u0439\u043b\u0430 \u0432 paste-rs<\/strong><\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.Client.html\">reqwest::Client<\/a> \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 <code>https:\/\/paste.rs<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.RequestBuilder.html\">reqwest::RequestBuilder<\/a>. <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.Client.html#method.post\">Client::post<\/a> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 POST-\u0437\u0430\u043f\u0440\u043e\u0441\u0430 HTTP, <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.RequestBuilder.html#method.body\">RequestBuilder::body<\/a> \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0430 <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.RequestBuilder.html#method.send\">RequestBuilder::send<\/a> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0434\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0444\u0430\u0439\u043b\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain; use std::fs::File; use std::io::Read;  error_chain! {     foreign_links {         HttpRequest(reqwest::Error);         IoError(::std::io::Error);     } }  #[tokio::main] async fn main() -> Result&lt;()> {     \/\/ \u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430     let paste_api = \"https:\/\/paste.rs\";     \/\/ \u0414\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u0430     let mut file = File::open(\"message.txt\")?;      let mut contents = String::new();     \/\/ \u0427\u0438\u0442\u0430\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443     file.read_to_string(&amp;mut contents)?;      \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0430     let client = reqwest::Client::new();     \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441     let res = client.post(paste_api).body(contents).send().await?;     \/\/ \u0427\u0438\u0442\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442     let response_text = res.text().await?;     println!(\"{}\", response_text);     Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>: \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u043f\u0443\u0441\u0442\u043e\u0439 \u0444\u0430\u0439\u043b <code>message.txt<\/code> \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>  <\/p>\n<p><strong>\u0427\u0430\u0441\u0442\u0438\u0447\u043d\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0430\u0439\u043b\u0430 \u043f\u043e HTTP \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430<\/strong><\/p>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/blocking\/struct.Client.html#method.head\">reqwest::blocking::Client::head<\/a> \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Content-Length\">Content-Length<\/a> (\u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e) \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/blocking\/struct.Client.html#method.get\">reqwest::blocking::Client::get<\/a> \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u043e \u0447\u0430\u0441\u0442\u044f\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 10240 \u0431\u0430\u0439\u0442 \u0441 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430. \u0427\u0430\u0441\u0442\u044c \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Headers\/Range\">Range<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432 <a href=\"https:\/\/tools.ietf.org\/html\/rfc7233#section-3.1\">RFC7233<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use error_chain::error_chain; use reqwest::header::{HeaderValue, CONTENT_LENGTH, RANGE}; use reqwest::StatusCode; use std::fs::File; use std::str::FromStr;  error_chain! {     foreign_links {         Io(std::io::Error);         Reqwest(reqwest::Error);         Header(reqwest::header::ToStrError);     } }  struct PartialRangeIter {     start: u64,     end: u64,     buffer_size: u32, }  impl PartialRangeIter {     pub fn new(start: u64, end: u64, buffer_size: u32) -> Result&lt;Self> {         if buffer_size == 0 {             Err(\"\u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 `buffer_size`, \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0442\u044c 0\")?;         }         Ok(PartialRangeIter {             start,             end,             buffer_size,         })     } }  impl Iterator for PartialRangeIter {     type Item = HeaderValue;      fn next(&amp;mut self) -> Option&lt;Self::Item> {         if self.start > self.end {             None         } else {             let prev_start = self.start;              self.start += std::cmp::min(self.buffer_size as u64, self.end - self.start + 1);              Some(                 HeaderValue::from_str(&amp;format!(\"bytes={}-{}\", prev_start, self.start - 1)).unwrap(),             )         }     } }  fn main() -> Result&lt;()> {     \/\/ \u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430     let url = \"https:\/\/httpbin.org\/range\/102400?duration=2\";     \/\/ \u0420\u0430\u0437\u043c\u0435\u0440 \u0447\u0430\u0441\u0442\u0438     const CHUNK_SIZE: u32 = 10240;      let client = reqwest::blocking::Client::new();     \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c HEAD-\u0437\u0430\u043f\u0440\u043e\u0441     let response = client.head(url).send()?;     \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a `Content-Length`     let length = response         .headers()         .get(CONTENT_LENGTH)         .ok_or(\"\u041e\u0442\u0432\u0435\u0442 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e\")?;     \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e     let length =         u64::from_str(length.to_str()?).map_err(|_| \"\u041d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a `Content-Length`\")?;      \/\/ \u0414\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u0430     let mut output_file = File::create(\"download.bin\")?;      println!(\"\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443...\");     for range in PartialRangeIter::new(0, length - 1, CHUNK_SIZE)? {         println!(\"\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d {:?}\", range);         \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c GET-\u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c `Range`         let mut response = client.get(url).header(RANGE, range).send()?;          let status = response.status();         if !(status == StatusCode::OK || status == StatusCode::PARTIAL_CONTENT) {             error_chain::bail!(\"\u041d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430: {}\", status)         }         \/\/ \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 \u0444\u0430\u0439\u043b         std::io::copy(&amp;mut response, &amp;mut output_file)?;     }      \/\/ \u0427\u0438\u0442\u0430\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442     let content = response.text()?;     \/\/ \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0431\u0430\u0439\u0442\u044b \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 \u0444\u0430\u0439\u043b     std::io::copy(&amp;mut content.as_bytes(), &amp;mut output_file)?;      println!(\"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430\");      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p><em>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/em>: \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0444\u0430\u0439\u043b <code>download.bin<\/code>.<\/p>\n<p>  <\/p>\n<p><strong>\u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f<\/strong><\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 HTTP \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <a href=\"https:\/\/docs.rs\/reqwest\/*\/reqwest\/struct.RequestBuilder.html#method.basic_auth\">reqwest::RequestBuilder::basic_auth<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"rust\">use reqwest::blocking::Client; use reqwest::Error;  fn main() -> Result&lt;(), Error> {     let client = Client::new();      let user_name = \"testuser\".to_string();     let password: Option&lt;String> = None;      \/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c GET-\u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439     let response = client         .get(\"https:\/\/httpbin.org\/\")         .basic_auth(user_name, password)         .send()?;      println!(\"{:?}\", response);      Ok(()) }<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043a\u043e\u043d\u0435\u0446 \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438 \u041a\u043d\u0438\u0433\u0438 \u0432 \u0446\u0435\u043b\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>Happy coding!<\/p>\n<p>  <\/p>\n<hr\/>\n<p>  <\/p>\n<blockquote><p><a href=\"https:\/\/t.me\/timewebru\"><b>\u041d\u043e\u0432\u043e\u0441\u0442\u0438, \u043e\u0431\u0437\u043e\u0440\u044b \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u044b \u043e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b Timeweb.Cloud \u2014 \u0432 \u043d\u0430\u0448\u0435\u043c Telegram-\u043a\u0430\u043d\u0430\u043b\u0435<\/b><\/a> <b>\u21a9<\/b><\/p><\/blockquote>\n<p><a href=\"https:\/\/timeweb.cloud\/?i=106909\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/b5\/pj\/of\/b5pjofdoxth14ro-rjsrn7sbmiy.png\" data-src=\"https:\/\/habrastorage.org\/webt\/b5\/pj\/of\/b5pjofdoxth14ro-rjsrn7sbmiy.png\"\/><\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/articles\/813791\/\"> https:\/\/habr.com\/ru\/articles\/813791\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/fj\/yi\/qn\/fjyiqnduv3l-rdgxnbu_t_qpgxk.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/fj\/yi\/qn\/fjyiqnduv3l-rdgxnbu_t_qpgxk.jpeg\" data-blurred=\"true\"\/>  <\/p>\n<p>  <\/p>\n<p>  <\/p>\n<p>Hello world!<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/rust-lang-nursery.github.io\/rust-cookbook\/\">\u041a\u043d\u0438\u0433\u0430 \u0440\u0435\u0446\u0435\u043f\u0442\u043e\u0432<\/a> \u2014 \u044d\u0442\u043e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0440\u0435\u0439\u0442\u043e\u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u044b <code>Rust<\/code>.<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/companies\/timeweb\/articles\/811915\/\">\u041f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/a><\/li>\n<li><a href=\"https:\/\/my-js.org\/docs\/guide\/rust-cookbook\">\u041a\u043d\u0438\u0433\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c<\/a><\/li>\n<\/ul>\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-375946","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/375946","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=375946"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/375946\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=375946"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=375946"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=375946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}