{"id":20037,"date":"2023-04-28T04:41:10","date_gmt":"2023-04-28T01:11:10","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/moving-from-electron-to-tauri-2-1jbl\/"},"modified":"2023-04-28T04:41:10","modified_gmt":"2023-04-28T01:11:10","slug":"moving-from-electron-to-tauri-2-1jbl","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/moving-from-electron-to-tauri-2-1jbl\/","title":{"rendered":"\u062d\u0631\u06a9\u062a \u0627\u0632 \u0627\u0644\u06a9\u062a\u0631\u0648\u0646 \u0628\u0647 Tauri 2"},"content":{"rendered":"<div data-article-id=\"1450083\" id=\"article-body\">\n<p>\u0628\u062e\u0634 2: \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0645\u062d\u0644\u06cc &#8211; \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062f\u0631 Rust \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Tauri.<\/p>\n<hr\/>\n<p><strong>TL;DR:<\/strong> \u0686\u0646\u062f\u06cc\u0646 \u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062a\u0639\u0628\u06cc\u0647 \u0634\u062f\u0647 \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u0641\u0627\u06cc\u0644 \u0628\u0631\u0627\u06cc Rust \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0647\u0633\u062a\u0646\u062f.  \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0628\u0647 \u0628\u0631\u0631\u0633\u06cc \u0628\u0631\u062e\u06cc \u0627\u0632 \u0622\u0646\u0647\u0627 \u0645\u06cc \u067e\u0631\u062f\u0627\u0632\u062f \u0648 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0622\u0646\u0647\u0627 \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u06cc \u06a9\u0647 \u0628\u0627 Tauri \u0648 Rust \u0646\u0648\u0634\u062a\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u062a\u0631\u06a9\u06cc\u0628 \u06a9\u0631\u062f.<\/p>\n<hr\/>\n<p>\u0627\u06cc\u0646 \u062f\u0648\u0645\u06cc\u0646 \u067e\u0633\u062a \u062f\u0631 \u0645\u0648\u0631\u062f \u0627\u0646\u062a\u0642\u0627\u0644 UMLBoard \u0628\u0647 Tauri \u0627\u0633\u062a.  \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0645\u0642\u0627\u0644\u0647 \u0642\u0628\u0644\u06cc \u0628\u0631 \u0631\u0648\u06cc \u0627\u0631\u062a\u0628\u0627\u0637\u0627\u062a \u0628\u06cc\u0646 \u0641\u0631\u0622\u06cc\u0646\u062f\u06cc \u0645\u062a\u0645\u0631\u06a9\u0632 \u0628\u0648\u062f\u060c \u0627\u06cc\u0646 \u0628\u0627\u0631 \u0628\u0647 \u0628\u0631\u0631\u0633\u06cc \u0686\u06af\u0648\u0646\u06af\u06cc \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0632\u06cc\u0631\u0633\u06cc\u0633\u062a\u0645 \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0645\u062d\u0644\u06cc \u0628\u0627 Rust \u062e\u0648\u0627\u0647\u06cc\u0645 \u067e\u0631\u062f\u0627\u062e\u062a. <\/p>\n<ul>\n<li>\n<del>\u0627\u0646\u062a\u0642\u0627\u0644 \u0627\u0631\u062a\u0628\u0627\u0637\u0627\u062a \u0628\u06cc\u0646 \u0641\u0631\u0622\u06cc\u0646\u062f\u06cc \u0628\u0647 Tauri<\/del> (\u067e\u0633\u062a \u0622\u062e\u0631 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f)<\/li>\n<li><strong>\u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u06cc\u06a9 \u0641\u0631\u0648\u0634\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062d\u0644\u06cc \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u0633\u0646\u062f \u0628\u0627 Rust (\u0627\u06cc\u0646 \u067e\u0633\u062a!)<\/strong><\/li>\n<li>\u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0627\u0632\u06af\u0627\u0631\u06cc SVG Webview \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0631\u0627 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f<\/li>\n<li>\u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f \u06a9\u0647 Rust \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u06cc \u0628\u0631\u0627\u06cc \u0637\u0631\u062d \u0628\u0646\u062f\u06cc \u062e\u0648\u062f\u06a9\u0627\u0631 \u0646\u0645\u0648\u062f\u0627\u0631 \u062f\u0627\u0631\u062f \u06cc\u0627 \u062e\u06cc\u0631<\/li>\n<\/ul>\n<p>\u0628\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u0646 \u0628\u0647 \u0627\u06cc\u0646 \u0647\u062f\u0641\u060c \u0627\u0628\u062a\u062f\u0627 \u0628\u0647 \u0628\u0631\u062e\u06cc \u0627\u0632 \u06af\u0632\u06cc\u0646\u0647\u200c\u0647\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u062f\u0627\u062f\u0647\u200c\u0634\u062f\u0647 \u062a\u0639\u0628\u06cc\u0647\u200c\u0634\u062f\u0647 \u0645\u0648\u062c\u0648\u062f \u0628\u0631\u0627\u06cc Rust \u0646\u06af\u0627\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u0648 \u0633\u067e\u0633 \u0646\u062d\u0648\u0647 \u0627\u062f\u063a\u0627\u0645 \u0622\u0646\u200c\u0647\u0627 \u0631\u0627 \u062f\u0631 \u0646\u0645\u0648\u0646\u0647 \u0627\u0648\u0644\u06cc\u0647\u200c\u0627\u06cc \u06a9\u0647 \u062f\u0631 \u0622\u062e\u0631\u06cc\u0646 \u067e\u0633\u062a \u062e\u0648\u062f \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u06cc\u0645\u060c \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u06cc\u062f.<\/p>\n<p>\u0627\u0645\u0627 \u0642\u0628\u0644 \u0627\u0632 \u0634\u0631\u0648\u0639 \u06a9\u062f\u0646\u0648\u06cc\u0633\u06cc\u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0646\u06af\u0627\u0647\u06cc \u0627\u062c\u0645\u0627\u0644\u06cc \u0628\u0647 \u0648\u0636\u0639\u06cc\u062a \u0641\u0639\u0644\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645:<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/moving-from-electron-to-tauri-2-1jbl\/#%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C_%D9%BE%D8%A7%DB%8C%D9%87\" >\u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0627\u06cc\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/moving-from-electron-to-tauri-2-1jbl\/#%D8%A7%D9%86%D8%AA%D9%82%D8%A7%D9%84_%D8%A7%D8%B2_Typescript_%D8%A8%D9%87_Rust\" >\u0627\u0646\u062a\u0642\u0627\u0644 \u0627\u0632 Typescript \u0628\u0647 Rust<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/moving-from-electron-to-tauri-2-1jbl\/#1_%DB%8C%D8%A7%D9%81%D8%AA%D9%86_%DB%8C%DA%A9_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87_%D8%AF%D8%A7%D8%AF%D9%87_%D9%85%D8%A8%D8%AA%D9%86%DB%8C_%D8%A8%D8%B1_%D9%81%D8%A7%DB%8C%D9%84_%D9%85%D9%86%D8%A7%D8%B3%D8%A8_%D8%AF%D8%B1_Rust\" >1. \u06cc\u0627\u0641\u062a\u0646 \u06cc\u06a9 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u0641\u0627\u06cc\u0644 \u0645\u0646\u0627\u0633\u0628 \u062f\u0631 Rust.<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/moving-from-electron-to-tauri-2-1jbl\/#2_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%DB%8C%DA%A9_%D9%84%D8%A7%DB%8C%D9%87_%D9%85%D8%AE%D8%B2%D9%86_%D8%AF%D8%B1_Rust\" >2. \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06cc\u06a9 \u0644\u0627\u06cc\u0647 \u0645\u062e\u0632\u0646 \u062f\u0631 Rust<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/moving-from-electron-to-tauri-2-1jbl\/#3_%D9%85%D8%AE%D8%B2%D9%86_%D8%B1%D8%A7_%D8%A8%D8%A7_%D9%85%D9%86%D8%B7%D9%82_%D8%AA%D8%AC%D8%A7%D8%B1%DB%8C_%D9%85%D8%A7_%D9%88%D8%B5%D9%84_%DA%A9%D9%86%DB%8C%D8%AF\" >3. \u0645\u062e\u0632\u0646 \u0631\u0627 \u0628\u0627 \u0645\u0646\u0637\u0642 \u062a\u062c\u0627\u0631\u06cc \u0645\u0627 \u0648\u0635\u0644 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/moving-from-electron-to-tauri-2-1jbl\/#4_%D9%87%D9%85%D9%87_%DA%86%DB%8C%D8%B2_%D8%B1%D8%A7_%D8%AF%D8%B1_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_Tauri_%D9%85%D8%A7_%D8%A7%D8%AF%D8%BA%D8%A7%D9%85_%DA%A9%D9%86%DB%8C%D8%AF\" >4. \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 Tauri \u0645\u0627 \u0627\u062f\u063a\u0627\u0645 \u06a9\u0646\u06cc\u062f<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/moving-from-electron-to-tauri-2-1jbl\/#%D9%86%D8%AA%DB%8C%D8%AC%D9%87\" >\u0646\u062a\u06cc\u062c\u0647<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C_%D9%BE%D8%A7%DB%8C%D9%87\"><\/span>\n<p>  \u0645\u0639\u0645\u0627\u0631\u06cc \u067e\u0627\u06cc\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0641\u0631\u0622\u06cc\u0646\u062f \u0627\u0635\u0644\u06cc UMLBoard \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u0627\u0644\u06a9\u062a\u0631\u0648\u0646\u060c \u0627\u0632 \u0645\u0639\u0645\u0627\u0631\u06cc \u0644\u0627\u06cc\u0647\u200c\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f \u06a9\u0647 \u0628\u0647 \u0686\u0646\u062f\u06cc\u0646 \u0633\u0631\u0648\u06cc\u0633 \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u062a\u0642\u0633\u06cc\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a.  \u0647\u0631 \u0633\u0631\u0648\u06cc\u0633 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u06cc\u06a9 \u0645\u062e\u0632\u0646 \u0628\u0631\u0627\u06cc \u062e\u0648\u0627\u0646\u062f\u0646 \u0648 \u0646\u0648\u0634\u062a\u0646 \u0646\u0645\u0648\u062f\u0627\u0631\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u067e\u06cc\u062f\u0627 \u0645\u06cc \u06a9\u0646\u062f.  \u0644\u0627\u06cc\u0647 \u062f\u0627\u062f\u0647 \u0627\u0632 nedb\u060c (\u06cc\u0627 \u0628\u0647\u062a\u0631 \u0627\u0632 \u0641\u0648\u0631\u06a9 \u0622\u0646 @seald-io\/nedb)\u060c \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 JSON \u062a\u06a9 \u0641\u0627\u06cc\u0644\u06cc \u062c\u0627\u0633\u0627\u0632\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0627\u06cc\u0646 \u0637\u0631\u0627\u062d\u06cc \u0627\u0645\u06a9\u0627\u0646 \u062c\u062f\u0627\u0633\u0627\u0632\u06cc \u0628\u0647\u062a\u0631 \u0628\u06cc\u0646 \u06a9\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0648 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0647\u0627\u06cc \u062e\u0627\u0635 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p> \u0645\u062e\u0627\u0632\u0646 \u0628\u0631\u0627\u06cc \u062c\u062f\u0627\u0633\u0627\u0632\u06cc \u0645\u0646\u0637\u0642 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0632 \u0644\u0627\u06cc\u0647 \u067e\u0627\u06cc\u062f\u0627\u0631\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u0646\u062f.&#8221; loading=&#8221;lazy&#8221; width=&#8221;800&#8243; height=&#8221;725&#8243;\/><\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A7%D9%86%D8%AA%D9%82%D8%A7%D9%84_%D8%A7%D8%B2_Typescript_%D8%A8%D9%87_Rust\"><\/span>\n<p>  \u0627\u0646\u062a\u0642\u0627\u0644 \u0627\u0632 Typescript \u0628\u0647 Rust<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0631\u0627\u06cc \u067e\u0648\u0631\u062a \u0627\u06cc\u0646 \u0645\u0639\u0645\u0627\u0631\u06cc \u0628\u0647 Rust\u060c \u0628\u0627\u06cc\u062f \u0647\u0631 \u0644\u0627\u06cc\u0647 \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u062c\u062f\u0627\u06af\u0627\u0646\u0647 \u062f\u0648\u0628\u0627\u0631\u0647 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u0645.  \u0645\u0627 \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0631\u0627 \u0628\u0627 \u062a\u0639\u0631\u06cc\u0641 \u0686\u0647\u0627\u0631 \u06a9\u0627\u0631 \u0641\u0631\u0639\u06cc \u0627\u0646\u062c\u0627\u0645 \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0627\u062f:<\/p>\n<ol>\n<li>\u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u0641\u0627\u06cc\u0644 \u0631\u0627 \u062f\u0631 Rust \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f. <\/li>\n<li>\u06cc\u06a9 \u0644\u0627\u06cc\u0647 \u0645\u062e\u0632\u0646 \u0628\u06cc\u0646 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0648 \u062e\u062f\u0645\u0627\u062a \u0645\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0645\u062e\u0632\u0646 \u0631\u0627 \u0628\u0627 \u0645\u0646\u0637\u0642 \u062a\u062c\u0627\u0631\u06cc \u0645\u0627 \u0648\u0635\u0644 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 Tauri \u0645\u0627 \u0627\u062f\u063a\u0627\u0645 \u06a9\u0646\u06cc\u062f.<\/li>\n<\/ol>\n<p>\u0628\u0627 \u067e\u06cc\u0631\u0648\u06cc \u0627\u0632 \u0627\u0633\u062a\u0631\u0627\u062a\u0698\u06cc \u0622\u062e\u0631\u06cc\u0646 \u067e\u0633\u062a \u0645\u0627\u060c \u0647\u0631 \u0645\u0631\u062d\u0644\u0647 \u0631\u0627 \u06cc\u06a9 \u0628\u0647 \u06cc\u06a9 \u0645\u0631\u0648\u0631 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"1_%DB%8C%D8%A7%D9%81%D8%AA%D9%86_%DB%8C%DA%A9_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87_%D8%AF%D8%A7%D8%AF%D9%87_%D9%85%D8%A8%D8%AA%D9%86%DB%8C_%D8%A8%D8%B1_%D9%81%D8%A7%DB%8C%D9%84_%D9%85%D9%86%D8%A7%D8%B3%D8%A8_%D8%AF%D8%B1_Rust\"><\/span>\n<p>  1. \u06cc\u0627\u0641\u062a\u0646 \u06cc\u06a9 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u0641\u0627\u06cc\u0644 \u0645\u0646\u0627\u0633\u0628 \u062f\u0631 Rust.<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0633\u062a\u0647 \u0647\u0627\u06cc Rust \u0645\u062a\u0639\u062f\u062f\u06cc \u0628\u0631\u0627\u06cc \u0647\u0631 \u062f\u0648 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 SQL \u0648 NoSQL \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f.  \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0647 \u0628\u0631\u062e\u06cc \u0627\u0632 \u0622\u0646\u0647\u0627 \u0646\u06af\u0627\u0647 \u06a9\u0646\u06cc\u0645.<br \/><small>(\u0644\u0637\u0641\u0627\u064b \u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0627\u06cc\u0646 \u0644\u06cc\u0633\u062a \u0628\u0647 \u0647\u06cc\u0686 \u0648\u062c\u0647 \u06a9\u0627\u0645\u0644 \u0646\u06cc\u0633\u062a\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u06af\u0631 \u0641\u06a9\u0631 \u0645\u06cc \u06a9\u0646\u06cc\u062f \u0645\u0646 \u06cc\u06a9 \u0645\u0648\u0631\u062f \u0645\u0647\u0645 \u0631\u0627 \u0627\u0632 \u062f\u0633\u062a \u062f\u0627\u062f\u0647 \u0627\u0645\u060c \u0628\u0647 \u0645\u0646 \u0627\u0637\u0644\u0627\u0639 \u062f\u0647\u06cc\u062f \u0648 \u0645\u06cc \u062a\u0648\u0627\u0646\u0645 \u0622\u0646 \u0631\u0627 \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u0645.)<\/small><\/p>\n<p><strong>1. unqlite<\/strong> \u06cc\u06a9 \u067e\u0648\u0634\u0634 Rust \u0628\u0631\u0627\u06cc \u0645\u0648\u062a\u0648\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 UnQLite.  \u0628\u0633\u06cc\u0627\u0631 \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f \u0627\u0645\u0627 \u062f\u06cc\u06af\u0631 \u0628\u0647 \u0637\u0648\u0631 \u0641\u0639\u0627\u0644 \u062a\u0648\u0633\u0639\u0647 \u0646\u0645\u06cc \u06cc\u0627\u0628\u062f &#8211; \u0622\u062e\u0631\u06cc\u0646 commit \u0686\u0646\u062f \u0633\u0627\u0644 \u067e\u06cc\u0634 \u0628\u0648\u062f.<\/p>\n<p><strong>2. PoloDB<\/strong> \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 JSON \u062a\u0639\u0628\u06cc\u0647 \u0634\u062f\u0647 \u0633\u0628\u06a9 \u0648\u0632\u0646.  \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u062f\u0631 \u062d\u0627\u0644 \u062a\u0648\u0633\u0639\u0647 \u0641\u0639\u0627\u0644 \u0627\u0633\u062a\u060c \u062f\u0631 \u0632\u0645\u0627\u0646 \u0646\u06af\u0627\u0631\u0634 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 (\u0628\u0647\u0627\u0631 2023)\u060c \u0647\u0646\u0648\u0632 \u0627\u0632 \u062f\u0633\u062a\u0631\u0633\u06cc \u0646\u0627\u0647\u0645\u0632\u0645\u0627\u0646 \u0628\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0646\u0645\u06cc \u06a9\u0646\u062f &#8211; \u0628\u0627 \u062a\u0648\u062c\u0647 \u0628\u0647 \u0627\u06cc\u0646\u06a9\u0647 \u0645\u0627 \u0641\u0642\u0637 \u0628\u0647 \u0641\u0627\u06cc\u0644 \u0647\u0627\u06cc \u0645\u062d\u0644\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0631\u06cc\u0645\u060c \u0645\u0634\u06a9\u0644 \u0628\u0632\u0631\u06af\u06cc \u0646\u06cc\u0633\u062a\u060c \u0627\u0645\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0628\u06cc\u0646\u06cc\u0645 \u0686\u0647 \u0686\u06cc\u0632 \u062f\u06cc\u06af\u0631\u06cc \u062f\u0627\u0631\u06cc\u0645. .<\/p>\n<p><strong>3. \u062f\u06cc\u0632\u0644<\/strong> \u0633\u0627\u0632\u0646\u062f\u0647 \u0648\u0627\u0642\u0639\u06cc SQL ORM \u0648 \u067e\u0631\u0633 \u0648 \u062c\u0648 \u0628\u0631\u0627\u06cc Rust.  \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0627\u0632 \u0686\u0646\u062f\u06cc\u0646 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 SQL\u060c \u0627\u0632 \u062c\u0645\u0644\u0647 SQLite &#8212; \u0645\u062a\u0627\u0633\u0641\u0627\u0646\u0647\u060c \u062f\u0631\u0627\u06cc\u0648\u0631 SQLite \u0647\u0646\u0648\u0632 \u0627\u0632 \u0639\u0645\u0644\u06cc\u0627\u062a \u0646\u0627\u0647\u0645\u0632\u0645\u0627\u0646 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0646\u0645\u06cc \u06a9\u0646\u062f[^1].<\/p>\n<p><strong>4. SeaORM<\/strong> \u06cc\u06a9 ORM \u062f\u06cc\u06af\u0631 SQL \u0628\u0631\u0627\u06cc Rust \u0628\u0627 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0627\u0632 SQLite \u0648 \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0646\u0627\u0647\u0645\u0632\u0645\u0627\u0646\u060c \u06a9\u0647 \u0622\u0646 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0646\u06cc\u0627\u0632\u0647\u0627\u06cc \u0645\u0627 \u0645\u0646\u0627\u0633\u0628 \u0645\u06cc \u06a9\u0646\u062f.  \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0647\u0646\u06af\u0627\u0645 \u062a\u0644\u0627\u0634 \u0628\u0631\u0627\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u06cc\u06a9 \u0645\u062e\u0632\u0646 \u0646\u0645\u0648\u0646\u0647 \u0627\u0648\u0644\u06cc\u0647\u060c \u0645\u062a\u0648\u062c\u0647 \u0634\u062f\u0645 \u06a9\u0647 \u062a\u0639\u0631\u06cc\u0641 \u06cc\u06a9 \u0645\u062e\u0632\u0646 \u0639\u0645\u0648\u0645\u06cc \u0628\u0631\u0627\u06cc SeaORM \u0628\u0647 \u062f\u0644\u06cc\u0644 \u062a\u0639\u062f\u0627\u062f \u0622\u0631\u06af\u0648\u0645\u0627\u0646\u200c\u0647\u0627 \u0648 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a\u200c\u0647\u0627\u06cc \u0646\u0648\u0639 \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0628\u0633\u06cc\u0627\u0631 \u067e\u06cc\u0686\u06cc\u062f\u0647 \u0634\u0648\u062f.<\/p>\n<p><strong>5. BonsaiDB<\/strong> \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u0633\u0646\u062f\u060c \u062f\u0631 \u062d\u0627\u0644 \u062d\u0627\u0636\u0631 \u062f\u0631 \u0622\u0644\u0641\u0627 \u0627\u0645\u0627 \u0628\u0647 \u0637\u0648\u0631 \u0641\u0639\u0627\u0644 \u062a\u0648\u0633\u0639\u0647 \u06cc\u0627\u0641\u062a\u0647 \u0627\u0633\u062a.  \u0627\u0632 \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0645\u062d\u0644\u06cc \u0648 \u062f\u0633\u062a\u0631\u0633\u06cc \u0646\u0627\u0647\u0645\u0632\u0645\u0627\u0646 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u062f.  \u0647\u0645\u0686\u0646\u06cc\u0646 \u0627\u0645\u06a9\u0627\u0646 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u067e\u0631\u0633 \u0648 \u062c\u0648\u0647\u0627\u06cc \u067e\u06cc\u0686\u06cc\u062f\u0647 \u062a\u0631 \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0641\u0631\u0627\u0647\u0645 \u0645\u06cc \u06a9\u0646\u062f <em>\u0628\u0627\u0632\u062f\u06cc\u062f\u0647\u0627<\/em>.<\/p>\n<p><strong>6. SurrealDB<\/strong> \u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc \u0628\u0631\u0627\u06cc \u0645\u0648\u062a\u0648\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 SurrealDB.  \u0627\u0632 \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0645\u062d\u0644\u06cc \u0627\u0632 \u0637\u0631\u06cc\u0642 RocksDB \u0648 \u0639\u0645\u0644\u06cc\u0627\u062a \u0646\u0627\u0647\u0645\u0632\u0645\u0627\u0646 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u062f. <\/p>\n<p>\u0627\u0632 \u062c\u0645\u0644\u0647 \u0627\u06cc\u0646 \u06af\u0632\u06cc\u0646\u0647 \u0647\u0627\u060c <strong>BonsaiDB<\/strong> \u0648 <strong>SurrealDB<\/strong> \u0627\u0645\u06cc\u062f\u0648\u0627\u0631\u06a9\u0646\u0646\u062f\u0647 \u062a\u0631\u06cc\u0646 \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u0646\u062f: \u0622\u0646\u0647\u0627 \u0627\u0632 \u062f\u0633\u062a\u0631\u0633\u06cc \u0646\u0627\u0647\u0645\u0632\u0645\u0627\u0646 \u0628\u0647 \u062f\u0627\u062f\u0647 \u0647\u0627 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc \u06a9\u0646\u0646\u062f\u060c \u0628\u0647 \u0641\u0631\u0622\u06cc\u0646\u062f \u062c\u062f\u0627\u06af\u0627\u0646\u0647 \u0627\u06cc \u0646\u06cc\u0627\u0632 \u0646\u062f\u0627\u0631\u0646\u062f \u0648 \u06cc\u06a9 API \u0646\u0633\u0628\u062a\u0627\u064b \u0622\u0633\u0627\u0646 \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062f\u0627\u0631\u0646\u062f.  \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0633\u0639\u06cc \u06a9\u0646\u06cc\u0645 \u0647\u0631 \u062f\u0648\u06cc \u0622\u0646\u0647\u0627 \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0627\u062f\u063a\u0627\u0645 \u06a9\u0646\u06cc\u0645.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"2_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%DB%8C%DA%A9_%D9%84%D8%A7%DB%8C%D9%87_%D9%85%D8%AE%D8%B2%D9%86_%D8%AF%D8%B1_Rust\"><\/span>\n<p>  2. \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06cc\u06a9 \u0644\u0627\u06cc\u0647 \u0645\u062e\u0632\u0646 \u062f\u0631 Rust<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u062f\u0648 \u0645\u0648\u062a\u0648\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062e\u062a\u0644\u0641 \u0631\u0627 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u0645\u060c \u0627\u0644\u06af\u0648\u06cc \u0645\u062e\u0632\u0646 \u06af\u0632\u06cc\u0646\u0647 \u062e\u0648\u0628\u06cc \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f \u0632\u06cc\u0631\u0627 \u0628\u0647 \u0645\u0627 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0627\u0632 \u0645\u0646\u0637\u0642 \u0628\u0631\u0646\u0627\u0645\u0647 \u062c\u062f\u0627 \u06a9\u0646\u06cc\u0645.  \u0628\u0647 \u0627\u06cc\u0646 \u062a\u0631\u062a\u06cc\u0628\u060c \u0645\u0627 \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0633\u06cc\u0633\u062a\u0645 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0632\u06cc\u0631\u0628\u0646\u0627\u06cc\u06cc \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u0645.<\/p>\n<p>\u062a\u0639\u0631\u06cc\u0641 \u0631\u0641\u062a\u0627\u0631 \u0645\u062e\u0632\u0646 \u0645\u0627 \u062f\u0631 Rust \u0628\u0647 \u0628\u0647\u062a\u0631\u06cc\u0646 \u0648\u062c\u0647 \u0628\u0627 \u06cc\u06a9 \u0648\u06cc\u0698\u06af\u06cc \u0628\u0647 \u062f\u0633\u062a \u0645\u06cc \u0622\u06cc\u062f.  \u0628\u0631\u0627\u06cc \u0627\u062b\u0628\u0627\u062a \u0645\u0641\u0647\u0648\u0645 \u0645\u0627\u060c \u0645\u0642\u062f\u0627\u0631\u06cc \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 <em>\u0686\u06cc\u0632 \u0686\u0646\u062f\u0634 \u0648 \u06a9\u062b\u06cc\u0641<\/em> \u0639\u0645\u0644\u06cc\u0627\u062a \u06a9\u0627\u0641\u06cc \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"c1\">\/\/ Trait describing the common behavior of <\/span>\n<span class=\"c1\">\/\/ a repository. TEntity is the type of<\/span>\n<span class=\"c1\">\/\/ domain entity handled by this repository.<\/span>\n<span class=\"k\">pub<\/span> <span class=\"k\">trait<\/span> <span class=\"n\">Repository<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">TEntity<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">fn<\/span> <span class=\"nf\">query_all<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Vec<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">TEntity<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">fn<\/span> <span class=\"nf\">query_by_id<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">id<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"nb\">str<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Option<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">TEntity<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">fn<\/span> <span class=\"nf\">insert<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">data<\/span><span class=\"p\">:<\/span> <span class=\"n\">TEntity<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"n\">TEntity<\/span><span class=\"p\">;<\/span>\n    <span class=\"k\">fn<\/span> <span class=\"nf\">edit<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">id<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"nb\">str<\/span><span class=\"p\">,<\/span> <span class=\"n\">data<\/span><span class=\"p\">:<\/span> <span class=\"n\">TEntity<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Option<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">TEntity<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u062e\u0632\u0646 \u0645\u0627 \u0646\u0633\u0628\u062a \u0628\u0647 \u0646\u0648\u0639 \u0645\u0648\u062c\u0648\u062f\u06cc\u062a \u062e\u0648\u062f \u0639\u0645\u0648\u0645\u06cc \u0627\u0633\u062a \u0648 \u0628\u0647 \u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0627\u0632 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u062e\u0648\u062f \u0628\u0631\u0627\u06cc \u0645\u0648\u062c\u0648\u062f\u06cc\u062a \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0645\u062c\u062f\u062f\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645.  \u0645\u0627 \u0628\u0647 \u06cc\u06a9 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0627\u0632 \u0627\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc \u0628\u0631\u0627\u06cc \u0647\u0631 \u0645\u0648\u062a\u0648\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u06cc \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u06a9\u0646\u06cc\u0645 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645. <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/nabfollower.com\/blog\/wp-content\/uploads\/2023\/04\/\u062d\u0631\u06a9\u062a-\u0627\u0632-\u0627\u0644\u06a9\u062a\u0631\u0648\u0646-\u0628\u0647-Tauri-2.jpg\" alt=\"\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u0645\u062e\u0632\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0622\u0632\u0645\u0627\u06cc\u0634 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0622\u0633\u0627\u0646 \u062a\u0631 \u06a9\u0646\u062f.\" loading=\"lazy\" width=\"800\" height=\"406\" title=\"\"><\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0628\u06cc\u0646\u06cc\u0645 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0628\u0631\u0627\u06cc \u0686\u0647 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f <em>BonsaiDB<\/em> \u0648 <em>SurrealDB<\/em>.<\/p>\n<p><strong><em>BonsaiDB<\/em><\/strong><\/p>\n<p>\u0627\u0628\u062a\u062f\u0627 \u06cc\u06a9 \u0633\u0627\u062e\u062a\u0627\u0631 \u0631\u0627 \u0627\u0639\u0644\u0627\u0645 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <em>\u0645\u062e\u0632\u0646 \u0628\u0648\u0646\u0633\u0627\u06cc<\/em> \u06a9\u0647 \u0628\u0647 BonsaiDB \u0627\u0631\u062c\u0627\u0639 \u062f\u0627\u0631\u062f <code>AsyncDatabase<\/code> \u0634\u06cc\u0626\u06cc \u06a9\u0647 \u0628\u0631\u0627\u06cc \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 DB \u062e\u0648\u062f \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"k\">pub<\/span> <span class=\"k\">struct<\/span> <span class=\"n\">BonsaiRepository<\/span><span class=\"o\">&lt;<\/span><span class=\"nv\">'a<\/span><span class=\"p\">,<\/span> <span class=\"n\">TData<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ gives access to a BonsaiDB database<\/span>\n    <span class=\"n\">db<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"nv\">'a<\/span> <span class=\"n\">AsyncDatabase<\/span><span class=\"p\">,<\/span>\n    <span class=\"c1\">\/\/ required as generic type is not (yet) used in the struct<\/span>\n    <span class=\"n\">phantom<\/span><span class=\"p\">:<\/span> <span class=\"n\">PhantomData<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">TData<\/span><span class=\"o\">&gt;<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0633\u0627\u062e\u062a\u0627\u0631 \u0645\u0627 \u06cc\u06a9 \u0622\u0631\u06af\u0648\u0645\u0627\u0646 \u0639\u0645\u0648\u0645\u06cc \u062f\u0627\u0631\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u0646\u0648\u0639 \u0645\u0648\u062c\u0648\u062f\u06cc\u062a \u0631\u0627 \u0628\u0627 \u0627\u06cc\u062c\u0627\u062f \u0646\u0645\u0648\u0646\u0647 \u0645\u0634\u062e\u0635 \u06a9\u0646\u06cc\u0645.  \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u06a9\u0627\u0645\u067e\u0627\u06cc\u0644\u0631 \u0627\u0632 \u0639\u062f\u0645 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0646\u0648\u0639 \u062f\u0631 \u0633\u0627\u062e\u062a\u0627\u0631 \u0634\u06a9\u0627\u06cc\u062a \u062f\u0627\u0631\u062f\u060c \u0628\u0627\u06cc\u062f a \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u0645 <code>phantom<\/code> \u0641\u06cc\u0644\u062f \u0628\u0631\u0627\u06cc \u0633\u0631\u06a9\u0648\u0628 \u0627\u06cc\u0646 \u062e\u0637\u0627.<\/p>\n<p>\u0627\u0645\u0627 \u0645\u0647\u0645\u062a\u0631 \u0627\u0632 \u0647\u0645\u0647\u060c \u0645\u0627 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0627\u062c\u0631\u0627\u06cc \u0622\u0646 \u062f\u0627\u0631\u06cc\u0645 <em>\u0645\u062e\u0632\u0646<\/em> \u0648\u06cc\u0698\u06af\u06cc \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a\u0627\u0631 \u0645\u0627:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"c1\">\/\/ Repository implementation for BonsaiDB database<\/span>\n<span class=\"nd\">#[async_trait]<\/span>\n<span class=\"k\">impl<\/span> <span class=\"o\">&lt;<\/span><span class=\"nv\">'a<\/span><span class=\"p\">,<\/span> <span class=\"n\">TData<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">Repository<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">TData<\/span><span class=\"o\">&gt;<\/span> <span class=\"k\">for<\/span> <span class=\"n\">BonsaiRepository<\/span><span class=\"o\">&lt;<\/span><span class=\"nv\">'a<\/span><span class=\"p\">,<\/span> <span class=\"n\">TData<\/span><span class=\"o\">&gt;<\/span> \n    <span class=\"c1\">\/\/ bounds are necessary to comply with BonsaiDB API<\/span>\n    <span class=\"k\">where<\/span> <span class=\"n\">TData<\/span><span class=\"p\">:<\/span> <span class=\"n\">SerializedCollection<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Contents<\/span> <span class=\"o\">=<\/span> <span class=\"n\">TData<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">+<\/span> \n    <span class=\"n\">Collection<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">PrimaryKey<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">+<\/span> <span class=\"k\">'static<\/span>  <span class=\"o\">+<\/span> <span class=\"nb\">Unpin<\/span> <span class=\"p\">{<\/span>\n\n    <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">query_all<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Vec<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">TData<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">docs<\/span> <span class=\"o\">=<\/span> <span class=\"nn\">TData<\/span><span class=\"p\">::<\/span><span class=\"nf\">all_async<\/span><span class=\"p\">(<\/span><span class=\"k\">self<\/span><span class=\"py\">.db<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">entities<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Vec<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">_<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"n\">docs<\/span><span class=\"nf\">.into_iter<\/span><span class=\"p\">()<\/span><span class=\"nf\">.map<\/span><span class=\"p\">(|<\/span><span class=\"n\">f<\/span><span class=\"p\">|<\/span> <span class=\"n\">f<\/span><span class=\"py\">.contents<\/span><span class=\"p\">)<\/span><span class=\"nf\">.collect<\/span><span class=\"p\">();<\/span>\n        <span class=\"n\">entities<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"c1\">\/\/ note that id is not required here, as already part of data<\/span>\n    <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">insert<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">data<\/span><span class=\"p\">:<\/span> <span class=\"n\">TData<\/span><span class=\"p\">,<\/span> <span class=\"n\">id<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"nb\">str<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"n\">TData<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">new_doc<\/span> <span class=\"o\">=<\/span> <span class=\"n\">data<\/span><span class=\"nf\">.push_into_async<\/span><span class=\"p\">(<\/span><span class=\"k\">self<\/span><span class=\"py\">.db<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\n        <span class=\"n\">new_doc<\/span><span class=\"py\">.contents<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">edit<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">id<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"nb\">str<\/span><span class=\"p\">,<\/span> <span class=\"n\">data<\/span><span class=\"p\">:<\/span> <span class=\"n\">TData<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"n\">TData<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">doc<\/span> <span class=\"o\">=<\/span> <span class=\"nn\">TData<\/span><span class=\"p\">::<\/span><span class=\"nf\">overwrite_async<\/span><span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">,<\/span> <span class=\"n\">data<\/span><span class=\"p\">,<\/span> <span class=\"k\">self<\/span><span class=\"py\">.db<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\n        <span class=\"n\">doc<\/span><span class=\"py\">.contents<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">query_by_id<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">id<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"nb\">str<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Option<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">TData<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">doc<\/span> <span class=\"o\">=<\/span> <span class=\"nn\">TData<\/span><span class=\"p\">::<\/span><span class=\"nf\">get_async<\/span><span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">,<\/span> <span class=\"k\">self<\/span><span class=\"py\">.db<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">()<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\n        <span class=\"nf\">Some<\/span><span class=\"p\">(<\/span><span class=\"n\">doc<\/span><span class=\"py\">.contents<\/span><span class=\"p\">)<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>Rust \u0647\u0646\u0648\u0632 \u0627\u0632 \u062a\u0648\u0627\u0628\u0639 \u0635\u0641\u062a \u0646\u0627\u0647\u0645\u0632\u0645\u0627\u0646 \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0646\u0645\u06cc \u06a9\u0646\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0627\u06cc\u062f \u0627\u0632 async_trait \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645.  \u0646\u0648\u0639 \u0639\u0645\u0648\u0645\u06cc \u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0628\u0647 \u06cc\u06a9 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0628\u0631\u0627\u06cc \u0633\u06cc\u06af\u0646\u0627\u0644 \u062f\u0627\u062f\u0646 \u0628\u0647 Rust \u06a9\u0647 \u062f\u0631 \u062d\u0627\u0644 \u06a9\u0627\u0631 \u0628\u0627 \u0622\u0646 \u0647\u0633\u062a\u06cc\u0645 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u062f <em>BonsaiDB<\/em> \u0645\u0648\u062c\u0648\u062f\u06cc\u062a \u0647\u0627.  \u0627\u06cc\u0646 \u0645\u0648\u062c\u0648\u062f\u06cc\u062a \u0647\u0627 \u0627\u0632 \u06cc\u06a9 \u0647\u062f\u0631 (\u06a9\u0647 \u062d\u0627\u0648\u06cc \u0645\u062a\u0627 \u062f\u0627\u062f\u0647 \u0645\u0627\u0646\u0646\u062f \u0634\u0646\u0627\u0633\u0647 \u0627\u0633\u062a) \u0648 \u0645\u062d\u062a\u0648\u0627 (\u062d\u0641\u0638 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u062f\u0627\u0645\u0646\u0647) \u0647\u0633\u062a\u0646\u062f.  \u0645\u0627 \u062e\u0648\u062f\u0645\u0627\u0646 \u0634\u0646\u0627\u0633\u0647 \u0647\u0627 \u0631\u0627 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc \u06a9\u0646\u06cc\u0645\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0641\u0642\u0637 \u0628\u0647 \u0634\u06cc \u0645\u062d\u062a\u0648\u0627 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645.<\/p>\n<p>\u0644\u0637\u0641\u0627\u064b \u0647\u0645\u0686\u0646\u06cc\u0646 \u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0627\u062e\u062a\u0635\u0627\u0631 \u0627\u0632 \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u062e\u0637\u0627 \u062f\u0631 \u0633\u0631\u0627\u0633\u0631 \u0646\u0645\u0648\u0646\u0647 \u0627\u0648\u0644\u06cc\u0647 \u0635\u0631\u0641\u0646\u0638\u0631 \u06a9\u0631\u062f\u0645. <\/p>\n<p><strong><em>SurrealDB<\/em><\/strong><\/p>\n<p>\u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc SurrealDB \u0645\u0627 \u0628\u0647 \u0637\u0648\u0631 \u0645\u0634\u0627\u0628\u0647 \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f\u060c \u0627\u0645\u0627 \u0627\u06cc\u0646 \u0628\u0627\u0631\u060c \u0645\u0627 \u0628\u0627\u06cc\u062f \u0646\u0627\u0645 \u062c\u062f\u0648\u0644 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0646\u06cc\u0632 \u0627\u0631\u0627\u0626\u0647 \u062f\u0647\u06cc\u0645 \u0632\u06cc\u0631\u0627 SurrealDB \u0628\u0647 \u0622\u0646 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0628\u062e\u0634\u06cc \u0627\u0632 \u06a9\u0644\u06cc\u062f \u0627\u0635\u0644\u06cc \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"k\">pub<\/span> <span class=\"k\">struct<\/span> <span class=\"n\">SurrealRepository<\/span><span class=\"o\">&lt;<\/span><span class=\"nv\">'a<\/span><span class=\"p\">,<\/span> <span class=\"n\">TData<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ reference to SurrealDB's Database object<\/span>\n    <span class=\"n\">db<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"nv\">'a<\/span> <span class=\"n\">Surreal<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Db<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">,<\/span>\n    <span class=\"c1\">\/\/ required as generic type not used<\/span>\n    <span class=\"n\">phantom<\/span><span class=\"p\">:<\/span> <span class=\"n\">PhantomData<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">TData<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">,<\/span>\n    <span class=\"c1\">\/\/ this is needed by SurrealDB API to identify objects<\/span>\n    <span class=\"n\">table_name<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"k\">'static<\/span> <span class=\"nb\">str<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0627\u0632 \u0647\u0645\u060c \u0627\u062c\u0631\u0627\u06cc \u0635\u0641\u062a \u0645\u0627 \u0639\u0645\u062f\u062a\u0627\u064b API \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0632\u06cc\u0631\u0628\u0646\u0627\u06cc\u06cc \u0631\u0627 \u0645\u06cc\u200c\u067e\u0648\u0634\u0627\u0646\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"c1\">\/\/ Repository implementation for SurrealDB database<\/span>\n<span class=\"nd\">#[async_trait]<\/span>\n<span class=\"k\">impl<\/span> <span class=\"o\">&lt;<\/span><span class=\"nv\">'a<\/span><span class=\"p\">,<\/span> <span class=\"n\">TData<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">Repository<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">TData<\/span><span class=\"o\">&gt;<\/span> <span class=\"k\">for<\/span> <span class=\"n\">SurrealRepository<\/span><span class=\"o\">&lt;<\/span><span class=\"nv\">'a<\/span><span class=\"p\">,<\/span> <span class=\"n\">TData<\/span><span class=\"o\">&gt;<\/span> \n<span class=\"k\">where<\/span> <span class=\"n\">TData<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Sync<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">Send<\/span> <span class=\"o\">+<\/span> <span class=\"n\">DeserializeOwned<\/span> <span class=\"o\">+<\/span> <span class=\"n\">Serialize<\/span> <span class=\"p\">{<\/span>\n\n    <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">query_all<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Vec<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">TData<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">entities<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Vec<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">TData<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"k\">self<\/span><span class=\"py\">.db<\/span><span class=\"nf\">.select<\/span><span class=\"p\">(<\/span><span class=\"k\">self<\/span><span class=\"py\">.table_name<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\n        <span class=\"n\">entities<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"c1\">\/\/ here we need the id, although its already stored in the data<\/span>\n    <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">insert<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">data<\/span><span class=\"p\">:<\/span> <span class=\"n\">TData<\/span><span class=\"p\">,<\/span> <span class=\"n\">id<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"nb\">str<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"n\">TData<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">created<\/span> <span class=\"o\">=<\/span> <span class=\"k\">self<\/span><span class=\"py\">.db<\/span><span class=\"nf\">.create<\/span><span class=\"p\">((<\/span><span class=\"k\">self<\/span><span class=\"py\">.table_name<\/span><span class=\"p\">,<\/span> <span class=\"n\">id<\/span><span class=\"p\">))<\/span>\n            <span class=\"nf\">.content<\/span><span class=\"p\">(<\/span><span class=\"n\">data<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\n        <span class=\"n\">created<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">edit<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">id<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"nb\">str<\/span><span class=\"p\">,<\/span> <span class=\"n\">data<\/span><span class=\"p\">:<\/span> <span class=\"n\">TData<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"n\">TData<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">updated<\/span> <span class=\"o\">=<\/span> <span class=\"k\">self<\/span><span class=\"py\">.db<\/span><span class=\"nf\">.update<\/span><span class=\"p\">((<\/span><span class=\"k\">self<\/span><span class=\"py\">.table_name<\/span><span class=\"p\">,<\/span> <span class=\"n\">id<\/span><span class=\"p\">))<\/span>\n            <span class=\"nf\">.content<\/span><span class=\"p\">(<\/span><span class=\"n\">data<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\n        <span class=\"n\">updated<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">query_by_id<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">id<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"nb\">str<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Option<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">TData<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">entity<\/span> <span class=\"o\">=<\/span> <span class=\"k\">self<\/span><span class=\"py\">.db<\/span><span class=\"nf\">.select<\/span><span class=\"p\">((<\/span><span class=\"k\">self<\/span><span class=\"py\">.table_name<\/span><span class=\"p\">,<\/span> <span class=\"n\">id<\/span><span class=\"p\">))<\/span><span class=\"k\">.await<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\n        <span class=\"n\">entity<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0631\u0627\u06cc \u062a\u06a9\u0645\u06cc\u0644 \u0627\u062c\u0631\u0627\u06cc \u0645\u062e\u0632\u0646\u060c \u0628\u0647 \u0622\u062e\u0631\u06cc\u0646 \u0686\u06cc\u0632 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u06cc\u0645: An <em>\u0648\u062c\u0648\u062f\u060c \u0645\u0648\u062c\u0648\u062f\u06cc\u062a<\/em> \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u0645.  \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646\u060c \u0645\u0627 \u0627\u0632 \u06cc\u06a9 \u0646\u0633\u062e\u0647 \u0633\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u0646\u0648\u0639 \u062f\u0627\u0645\u0646\u0647 UML \u06af\u0633\u062a\u0631\u062f\u0647\u060c \u06cc\u06a9 Classifier \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645.<br \/>\u0627\u06cc\u0646 \u06cc\u06a9 \u0646\u0648\u0639 \u06a9\u0644\u06cc \u062f\u0631 UML \u0627\u0633\u062a \u06a9\u0647 \u0628\u0631\u0627\u06cc \u062a\u0648\u0635\u06cc\u0641 \u0645\u0641\u0627\u0647\u06cc\u0645\u06cc \u0645\u0627\u0646\u0646\u062f a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f <em>\u06a9\u0644\u0627\u0633<\/em>\u060c <em>\u0631\u0627\u0628\u0637<\/em>\u060c \u06cc\u0627 <em>\u0646\u0648\u0639 \u062f\u0627\u062f\u0647<\/em>.  \u0645\u0627 <code>Classifier<\/code> \u0633\u0627\u062e\u062a\u0627\u0631 \u0634\u0627\u0645\u0644 \u0628\u0631\u062e\u06cc \u0627\u0632 \u0648\u06cc\u0698\u06af\u06cc \u0647\u0627\u06cc \u062f\u0627\u0645\u0646\u0647 \u0645\u0639\u0645\u0648\u0644\u06cc \u0627\u0633\u062a\u060c \u0627\u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u06cc\u06a9 <em>_\u0634\u0646\u0627\u0633\u0647<\/em> \u0641\u06cc\u0644\u062f\u06cc \u06a9\u0647 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06a9\u0644\u06cc\u062f \u0627\u0635\u0644\u06cc \u0639\u0645\u0644 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"nd\">#[derive(Debug,<\/span> <span class=\"nd\">Serialize,<\/span> <span class=\"nd\">Deserialize,<\/span> <span class=\"nd\">Default,<\/span> <span class=\"nd\">Collection)]<\/span>\n<span class=\"nd\">#[collection(<\/span> <span class=\"c1\">\/\/ custom key definition for BonsaiDB<\/span>\n    <span class=\"nd\">name=<\/span><span class=\"s\">\"classifiers\"<\/span><span class=\"nd\">,<\/span> \n    <span class=\"nd\">primary_key<\/span> <span class=\"nd\">=<\/span> <span class=\"nd\">String,<\/span> \n    <span class=\"nd\">natural_id<\/span> <span class=\"nd\">=<\/span> <span class=\"err\">|<\/span><span class=\"nd\">classifier:<\/span> <span class=\"err\">&amp;<\/span><span class=\"nd\">Classifier<\/span><span class=\"err\">|<\/span> <span class=\"nd\">Some(classifier<\/span><span class=\"err\">.<\/span><span class=\"nd\">_id<\/span><span class=\"err\">.<\/span><span class=\"nd\">clone()))]<\/span>\n<span class=\"k\">pub<\/span> <span class=\"k\">struct<\/span> <span class=\"n\">Classifier<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">pub<\/span> <span class=\"n\">_id<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">,<\/span>\n    <span class=\"k\">pub<\/span> <span class=\"n\">name<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">,<\/span>\n    <span class=\"k\">pub<\/span> <span class=\"n\">position<\/span><span class=\"p\">:<\/span> <span class=\"n\">Point<\/span><span class=\"p\">,<\/span>\n    <span class=\"k\">pub<\/span> <span class=\"n\">is_interface<\/span><span class=\"p\">:<\/span> <span class=\"nb\">bool<\/span><span class=\"p\">,<\/span>\n    <span class=\"k\">pub<\/span> <span class=\"n\">custom_dimension<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Option<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Dimension<\/span><span class=\"o\">&gt;<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u06af\u0641\u062a\u0646 <em>BonsaiDB<\/em> \u06a9\u0647 \u0645\u0627 \u0634\u0646\u0627\u0633\u0647 \u0647\u0627\u06cc \u0645\u0648\u062c\u0648\u062f\u06cc\u062a \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0645\u06cc \u06a9\u0646\u06cc\u0645 <code>_id<\/code> \u0641\u06cc\u0644\u062f\u060c \u0628\u0627\u06cc\u062f \u0646\u0648\u0639 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u06cc\u06a9 \u0645\u0627\u06a9\u0631\u0648 \u0627\u0636\u0627\u0641\u06cc \u062a\u0632\u0626\u06cc\u0646 \u06a9\u0646\u06cc\u0645.<br \/>\u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u062f\u0627\u0634\u062a\u0646 \u0634\u0646\u0627\u0633\u0647\u200c\u0647\u0627\u06cc \u062e\u0648\u062f \u0646\u06cc\u0627\u0632\u0645\u0646\u062f \u06a9\u0645\u06cc \u06a9\u0627\u0631 \u0628\u06cc\u0634\u062a\u0631 \u0627\u0633\u062a\u060c \u0628\u0647 \u0645\u0627 \u06a9\u0645\u06a9 \u0645\u06cc\u200c\u06a9\u0646\u062f \u062a\u0627 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc\u200c\u0647\u0627\u06cc \u062e\u0627\u0635 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0627\u0646\u062a\u0632\u0627\u0639\u06cc \u06a9\u0646\u06cc\u0645 \u0648 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0645\u0648\u062a\u0648\u0631\u0647\u0627\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062c\u062f\u06cc\u062f \u0631\u0627 \u0622\u0633\u0627\u0646\u200c\u062a\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"3_%D9%85%D8%AE%D8%B2%D9%86_%D8%B1%D8%A7_%D8%A8%D8%A7_%D9%85%D9%86%D8%B7%D9%82_%D8%AA%D8%AC%D8%A7%D8%B1%DB%8C_%D9%85%D8%A7_%D9%88%D8%B5%D9%84_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  3. \u0645\u062e\u0632\u0646 \u0631\u0627 \u0628\u0627 \u0645\u0646\u0637\u0642 \u062a\u062c\u0627\u0631\u06cc \u0645\u0627 \u0648\u0635\u0644 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u0631\u0627\u06cc \u0627\u062a\u0635\u0627\u0644 \u0628\u0627\u0637\u0646 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0628\u0627 \u0645\u0646\u0637\u0642 \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627\u060c \u0645\u0627 \u0631\u0627 \u062a\u0632\u0631\u06cc\u0642 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <em>\u0645\u062e\u0632\u0646<\/em> \u0635\u0641\u062a \u0628\u0647 <em>ClassifierService<\/em> \u0648 \u0622\u0631\u06af\u0648\u0645\u0627\u0646 \u0646\u0648\u0639 \u0631\u0627 \u0645\u062d\u062f\u0648\u062f \u06a9\u0646\u06cc\u062f <em>\u0637\u0628\u0642\u0647 \u0628\u0646\u062f\u06cc<\/em>.  \u0646\u0648\u0639 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0648\u0627\u0642\u0639\u06cc \u0645\u062e\u0632\u0646 (\u0648 \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u0627\u0646\u062f\u0627\u0632\u0647 \u0622\u0646) \u062f\u0631 \u0632\u0645\u0627\u0646 \u06a9\u0627\u0645\u067e\u0627\u06cc\u0644 \u0645\u0634\u062e\u0635 \u0646\u06cc\u0633\u062a\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0628\u0627\u06cc\u062f \u0627\u0632 <code>dyn<\/code> \u06a9\u0644\u0645\u0647 \u06a9\u0644\u06cc\u062f\u06cc \u062f\u0631 \u0627\u0639\u0644\u0627\u0645\u06cc\u0647<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"c1\">\/\/ classifier service holding a typed repository<\/span>\n<span class=\"k\">pub<\/span> <span class=\"k\">struct<\/span> <span class=\"n\">ClassifierService<\/span> <span class=\"p\">{<\/span>\n    <span class=\"c1\">\/\/ constraints required by Tauri to support multi threading<\/span>\n    <span class=\"n\">repository<\/span> <span class=\"p\">:<\/span> <span class=\"nb\">Box<\/span><span class=\"o\">&lt;<\/span><span class=\"k\">dyn<\/span> <span class=\"n\">Repository<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Classifier<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">Send<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">Sync<\/span><span class=\"o\">&gt;<\/span> \n<span class=\"p\">}<\/span>\n\n<span class=\"k\">impl<\/span> <span class=\"n\">ClassifierService<\/span> <span class=\"p\">{<\/span>    \n    <span class=\"k\">pub<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">new<\/span><span class=\"p\">(<\/span><span class=\"n\">repository<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Box<\/span><span class=\"o\">&lt;<\/span><span class=\"k\">dyn<\/span> <span class=\"n\">Repository<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Classifier<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">Send<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">Sync<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"k\">Self<\/span> <span class=\"p\">{<\/span> \n        <span class=\"k\">Self<\/span> <span class=\"p\">{<\/span> <span class=\"n\">repository<\/span> <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0627\u06cc\u0646 \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0627\u0647\u062f\u0627\u0641 \u0646\u0645\u0627\u06cc\u0634\u06cc \u0627\u0633\u062a\u060c \u0633\u0631\u0648\u06cc\u0633 \u0645\u0627 \u0628\u06cc\u0634\u062a\u0631 \u06a9\u0627\u0631 \u0631\u0627 \u0628\u062f\u0648\u0646 \u0647\u06cc\u0686 \u0645\u0646\u0637\u0642 \u062a\u062c\u0627\u0631\u06cc \u067e\u06cc\u0686\u06cc\u062f\u0647 \u0627\u06cc \u0628\u0647 \u0645\u062e\u0632\u0646 \u0648\u0627\u06af\u0630\u0627\u0631 \u0645\u06cc \u06a9\u0646\u062f.  \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u0627\u0635\u0644\u06cc \u0645\u0648\u062c\u0648\u062f\u06cc\u062a\u200c\u0647\u0627\u06cc\u0645\u0627\u0646\u060c \u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u0634\u0646\u0627\u0633\u0647\u200c\u0647\u0627\u06cc \u0645\u0646\u062d\u0635\u0631\u0628\u0647\u200c\u0641\u0631\u062f \u0628\u0647 \u062c\u0639\u0628\u0647 uuid \u062a\u06a9\u06cc\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645.<\/p>\n<p>\u0642\u0637\u0639\u0647 \u0632\u06cc\u0631 \u0641\u0642\u0637 \u0634\u0627\u0645\u0644 \u06cc\u06a9 \u06af\u0632\u06cc\u062f\u0647 \u0627\u0633\u062a\u060c \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u06a9\u0627\u0645\u0644\u060c \u0644\u0637\u0641\u0627\u064b \u0628\u0647 \u0645\u062e\u0632\u0646 Github \u0645\u0631\u0627\u062c\u0639\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"k\">impl<\/span> <span class=\"n\">ClassifierService<\/span> <span class=\"p\">{<\/span>\n\n     <span class=\"k\">pub<\/span> <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">create_new_classifier<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">new_name<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"nb\">str<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"n\">Classifier<\/span> <span class=\"p\">{<\/span> \n        <span class=\"c1\">\/\/ we have to manage the ids on our own, so create a new one here<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">id<\/span> <span class=\"o\">=<\/span> <span class=\"nn\">Uuid<\/span><span class=\"p\">::<\/span><span class=\"nf\">new_v4<\/span><span class=\"p\">()<\/span><span class=\"nf\">.to_string<\/span><span class=\"p\">();<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">new_classifier<\/span> <span class=\"o\">=<\/span> <span class=\"k\">self<\/span><span class=\"py\">.repository<\/span><span class=\"nf\">.insert<\/span><span class=\"p\">(<\/span><span class=\"n\">Classifier<\/span><span class=\"p\">{<\/span>\n            <span class=\"n\">_id<\/span><span class=\"p\">:<\/span> <span class=\"n\">id<\/span><span class=\"nf\">.to_string<\/span><span class=\"p\">(),<\/span> \n            <span class=\"n\">name<\/span><span class=\"p\">:<\/span> <span class=\"n\">new_name<\/span><span class=\"nf\">.to_string<\/span><span class=\"p\">(),<\/span> \n            <span class=\"n\">is_interface<\/span><span class=\"p\">:<\/span> <span class=\"k\">false<\/span><span class=\"p\">,<\/span> \n            <span class=\"o\">..<\/span><span class=\"nn\">Default<\/span><span class=\"p\">::<\/span><span class=\"nf\">default<\/span><span class=\"p\">()<\/span>\n        <span class=\"p\">},<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">id<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"p\">;<\/span>\n        <span class=\"n\">new_classifier<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">pub<\/span> <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">update_classifier_name<\/span><span class=\"p\">(<\/span>\n        <span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">id<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"nb\">str<\/span><span class=\"p\">,<\/span> <span class=\"n\">new_name<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"nb\">str<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"n\">Classifier<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">let<\/span> <span class=\"k\">mut<\/span> <span class=\"n\">classifier<\/span> <span class=\"o\">=<\/span> <span class=\"k\">self<\/span><span class=\"py\">.repository<\/span><span class=\"nf\">.query_by_id<\/span><span class=\"p\">(<\/span><span class=\"n\">id<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\n        <span class=\"n\">classifier<\/span><span class=\"py\">.name<\/span> <span class=\"o\">=<\/span> <span class=\"n\">new_name<\/span><span class=\"nf\">.to_string<\/span><span class=\"p\">();<\/span>\n        <span class=\"c1\">\/\/ we need to copy the id because \"edit\" owns the containing struct<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">id<\/span> <span class=\"o\">=<\/span> <span class=\"n\">classifier<\/span><span class=\"py\">._id<\/span><span class=\"nf\">.clone<\/span><span class=\"p\">();<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">updated<\/span> <span class=\"o\">=<\/span> <span class=\"k\">self<\/span><span class=\"py\">.repository<\/span><span class=\"nf\">.edit<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"n\">id<\/span><span class=\"p\">,<\/span> <span class=\"n\">classifier<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"p\">;<\/span>\n        <span class=\"n\">updated<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<h3><span class=\"ez-toc-section\" id=\"4_%D9%87%D9%85%D9%87_%DA%86%DB%8C%D8%B2_%D8%B1%D8%A7_%D8%AF%D8%B1_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_Tauri_%D9%85%D8%A7_%D8%A7%D8%AF%D8%BA%D8%A7%D9%85_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  4. \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 Tauri \u0645\u0627 \u0627\u062f\u063a\u0627\u0645 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0647 \u0642\u0633\u0645\u062a \u0622\u062e\u0631 \u0628\u0631\u0648\u06cc\u0645\u060c \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0631\u0627 \u0628\u0627 \u0647\u0645 \u062c\u0645\u0639 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u062a\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0648 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u0645.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u0646\u0645\u0648\u0646\u0647 \u0627\u0648\u0644\u06cc\u0647\u060c \u0645\u0627 \u0641\u0642\u0637 \u0631\u0648\u06cc \u062f\u0648 \u0645\u0648\u0631\u062f \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0633\u0627\u062f\u0647 \u062a\u0645\u0631\u06a9\u0632 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f:<\/p>\n<p><strong>(1)<\/strong> \u0647\u0646\u06af\u0627\u0645 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u060c \u0641\u0631\u0622\u06cc\u0646\u062f \u0627\u0635\u0644\u06cc \u0647\u0645\u0647 \u0637\u0628\u0642\u0647\u200c\u0628\u0646\u062f\u06cc\u200c\u06a9\u0646\u0646\u062f\u0647\u200c\u0647\u0627\u06cc \u0645\u0648\u062c\u0648\u062f \u0631\u0627 \u0628\u0647 \u0646\u0645\u0627\u06cc \u0648\u0628 \u0645\u06cc\u200c\u0641\u0631\u0633\u062a\u062f (\u062f\u0631 \u0635\u0648\u0631\u062a \u0648\u062c\u0648\u062f \u0637\u0628\u0642\u0647\u200c\u0628\u0646\u062f\u06cc\u200c\u06a9\u0646\u0646\u062f\u0647 \u062c\u062f\u06cc\u062f \u0628\u0647\u200c\u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u0634\u0648\u062f)\u060c \u0648<br \/><strong>(2)<\/strong> \u0648\u06cc\u0631\u0627\u06cc\u0634 \u0646\u0627\u0645 \u0637\u0628\u0642\u0647 \u0628\u0646\u062f\u06cc \u06a9\u0646\u0646\u062f\u0647 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0641\u06cc\u0644\u062f \u0648\u06cc\u0631\u0627\u06cc\u0634\u060c \u0645\u0648\u062c\u0648\u062f\u06cc\u062a \u0645\u0648\u062c\u0648\u062f \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0646\u0645\u0648\u062f\u0627\u0631 \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0631\u0627\u06cc \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u06a9\u0627\u0645\u0644 \u0628\u0628\u06cc\u0646\u06cc\u062f:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/nabfollower.com\/blog\/wp-content\/uploads\/2023\/04\/1682644270_471_\u062d\u0631\u06a9\u062a-\u0627\u0632-\u0627\u0644\u06a9\u062a\u0631\u0648\u0646-\u0628\u0647-Tauri-2.jpg\" alt=\"\u062c\u0631\u06cc\u0627\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0631\u0627\u0647 \u0627\u0646\u062f\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u062f \u0648 \u06cc\u06a9 \u0637\u0628\u0642\u0647 \u0628\u0646\u062f\u06cc \u06a9\u0646\u0646\u062f\u0647 \u0631\u0627 \u0648\u06cc\u0631\u0627\u06cc\u0634 \u0645\u06cc \u06a9\u0646\u062f.\" loading=\"lazy\" width=\"800\" height=\"304\" title=\"\"><\/p>\n<p>\u0645\u0648\u0631\u062f \u062f\u0648\u0645 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u0622\u0634\u0646\u0627 \u0628\u0647 \u0646\u0638\u0631 \u0628\u0631\u0633\u062f: \u0645\u0627 \u0642\u0628\u0644\u0627\u064b \u0622\u0646 \u0631\u0627 \u062a\u0627 \u062d\u062f\u06cc \u062f\u0631 \u0622\u062e\u0631\u06cc\u0646 \u067e\u0633\u062a \u062e\u0648\u062f \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u06a9\u0631\u062f\u0647\u200c\u0627\u06cc\u0645\u060c \u0627\u0645\u0627 \u0628\u062f\u0648\u0646 \u062a\u062f\u0627\u0648\u0645 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u062f\u0631 \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647. <\/p>\n<p>\u0622\u062e\u0631\u06cc\u0646 \u0628\u0627\u0631\u060c \u0633\u0631\u0648\u06cc\u0633 \u0645\u0627 \u06cc\u06a9 \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0631\u062f <em>ActionHandler<\/em> \u0648\u06cc\u0698\u06af\u06cc \u0628\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u062f\u0631\u06cc\u0627\u0641\u062a\u06cc \u0627\u0632 \u0646\u0645\u0627\u06cc \u0648\u0628.  \u062f\u0631 \u062d\u0627\u0644\u06cc \u06a9\u0647 \u0627\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u06a9\u0627\u0631 \u0645\u06cc \u06a9\u0631\u062f\u060c \u062a\u0646\u0647\u0627 \u0628\u0647 \u06cc\u06a9 \u0646\u0648\u0639 \u0639\u0645\u0644 \u0645\u062d\u062f\u0648\u062f \u0645\u06cc \u0634\u062f <em>ClassifierActions<\/em>. <\/p>\n<p>\u0627\u06cc\u0646 \u0628\u0627\u0631\u060c \u0645\u0627 \u0628\u06cc\u0634 \u0627\u0632 \u06cc\u06a9 \u0646\u0648\u0639 \u0639\u0645\u0644 \u062f\u0627\u0631\u06cc\u0645: <em>ApplicationActions<\/em> \u06a9\u0647 \u062c\u0631\u06cc\u0627\u0646 \u06a9\u0644\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u06a9\u0646\u062a\u0631\u0644 \u0645\u06cc \u06a9\u0646\u0646\u062f \u0648 <em>ClassifierActions<\/em> \u0628\u0631\u0627\u06cc \u0631\u0641\u062a\u0627\u0631 \u062e\u0627\u0635 \u0645\u0648\u062c\u0648\u062f\u06cc\u062a \u0647\u0627\u06cc \u0637\u0628\u0642\u0647 \u0628\u0646\u062f\u06cc \u06a9\u0646\u0646\u062f\u0647.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0631\u0633\u06cc\u062f\u06af\u06cc \u0628\u0647 \u0647\u0631 \u062f\u0648 \u0646\u0648\u0639 \u0628\u0647 \u0637\u0648\u0631 \u06cc\u06a9\u0646\u0648\u0627\u062e\u062a\u060c \u0645\u0627 \u0648\u06cc\u0698\u06af\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u06cc\u06a9 \u063a\u06cc\u0631\u0639\u0645\u0648\u0645\u06cc \u062a\u0642\u0633\u06cc\u0645 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <em>ActionDispatcher<\/em> \u0645\u0633\u0626\u0648\u0644 \u0645\u0633\u06cc\u0631\u06cc\u0627\u0628\u06cc \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u0628\u0647 \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0646\u0646\u062f\u0647 \u0645\u0631\u0628\u0648\u0637\u0647 \u062e\u0648\u062f\u060c \u0648 \u06cc\u06a9 <em>ActionHandler<\/em> \u0628\u0627 \u0645\u0646\u0637\u0642 \u062f\u0627\u0645\u0646\u0647 \u0648\u0627\u0642\u0639\u06cc <\/p>\n<p>\u0633\u0631\u0648\u06cc\u0633 \u0645\u0627 \u0628\u0627\u06cc\u062f \u0647\u0631 \u062f\u0648 \u0648\u06cc\u0698\u06af\u06cc \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u062f\u060c \u0627\u0628\u062a\u062f\u0627 \u062a\u0648\u0632\u06cc\u0639 \u06a9\u0646\u0646\u062f\u0647<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"c1\">\/\/ Dispatcher logic to choose the correct handler <\/span>\n<span class=\"c1\">\/\/ depending on the action's domain<\/span>\n<span class=\"nd\">#[async_trait]<\/span>\n<span class=\"k\">impl<\/span> <span class=\"n\">ActionDispatcher<\/span> <span class=\"k\">for<\/span> <span class=\"n\">ClassifierService<\/span> <span class=\"p\">{<\/span>\n\n    <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">dispatch_action<\/span><span class=\"p\">(<\/span>\n        <span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">domain<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">,<\/span> <span class=\"n\">action<\/span><span class=\"p\">:<\/span> <span class=\"n\">Value<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span>  <span class=\"n\">Value<\/span> <span class=\"p\">{<\/span>\n\n        <span class=\"k\">if<\/span> <span class=\"n\">domain<\/span> <span class=\"o\">==<\/span> <span class=\"n\">CLASSIFIER_DOMAIN<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nn\">ActionHandler<\/span><span class=\"p\">::<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">ClassifierAction<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">::<\/span><span class=\"nf\">convert_and_handle<\/span><span class=\"p\">(<\/span>\n                <span class=\"k\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">action<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span>\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span>  <span class=\"k\">if<\/span> <span class=\"n\">domain<\/span> <span class=\"o\">==<\/span> <span class=\"n\">APPLICATION_DOMAIN<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nn\">ActionHandler<\/span><span class=\"p\">::<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">ApplicationAction<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">::<\/span><span class=\"nf\">convert_and_handle<\/span><span class=\"p\">(<\/span>\n                <span class=\"k\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">action<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span>\n        <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\n            <span class=\"c1\">\/\/ this should normally not happen, either <\/span>\n            <span class=\"c1\">\/\/ throw an error or change return type to Option<\/span>\n            <span class=\"nd\">todo!<\/span><span class=\"p\">();<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648 \u0633\u067e\u0633 <em>ActionHandler<\/em> \u0628\u0631\u0627\u06cc \u0647\u0631 \u0646\u0648\u0639 \u0627\u0642\u062f\u0627\u0645\u06cc \u06a9\u0647 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u0645 \u062d\u0645\u0627\u06cc\u062a \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code>\n<span class=\"c1\">\/\/ handling of classifier related actions<\/span>\n<span class=\"nd\">#[async_trait]<\/span>\n<span class=\"k\">impl<\/span> <span class=\"n\">ActionHandler<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">ClassifierAction<\/span><span class=\"o\">&gt;<\/span> <span class=\"k\">for<\/span> <span class=\"n\">ClassifierService<\/span> <span class=\"p\">{<\/span>\n\n    <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">handle_action<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">action<\/span><span class=\"p\">:<\/span> <span class=\"n\">ClassifierAction<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"n\">ClassifierAction<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">response<\/span> <span class=\"o\">=<\/span> <span class=\"k\">match<\/span> <span class=\"n\">action<\/span> <span class=\"p\">{<\/span>\n            <span class=\"c1\">\/\/ rename the entity and return the new entity state<\/span>\n            <span class=\"nn\">ClassifierAction<\/span><span class=\"p\">::<\/span><span class=\"nf\">RenameClassifier<\/span><span class=\"p\">(<\/span><span class=\"n\">data<\/span><span class=\"p\">)<\/span> <span class=\"k\">=&gt;<\/span> <span class=\"p\">{<\/span>\n                <span class=\"k\">let<\/span> <span class=\"n\">classifier<\/span> <span class=\"o\">=<\/span> <span class=\"k\">self<\/span><span class=\"nf\">.update_classifier_name<\/span><span class=\"p\">(<\/span>\n                    <span class=\"o\">&amp;<\/span><span class=\"n\">data<\/span><span class=\"py\">.id<\/span><span class=\"p\">,<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">data<\/span><span class=\"py\">.new_name<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"p\">;<\/span>\n                <span class=\"nn\">ClassifierAction<\/span><span class=\"p\">::<\/span><span class=\"nf\">ClassifierRenamed<\/span><span class=\"p\">(<\/span>\n                    <span class=\"n\">EditNameDto<\/span><span class=\"p\">{<\/span> <span class=\"n\">id<\/span><span class=\"p\">:<\/span> <span class=\"n\">classifier<\/span><span class=\"py\">._id<\/span><span class=\"p\">,<\/span> <span class=\"n\">new_name<\/span><span class=\"p\">:<\/span> <span class=\"n\">classifier<\/span><span class=\"py\">.name<\/span><span class=\"p\">}<\/span>\n                <span class=\"p\">)<\/span>\n            <span class=\"p\">},<\/span>\n            <span class=\"c1\">\/\/ cancel the rename operation by returning the original name<\/span>\n            <span class=\"nn\">ClassifierAction<\/span><span class=\"p\">::<\/span><span class=\"n\">CancelClassifierRename<\/span><span class=\"p\">{<\/span><span class=\"n\">id<\/span><span class=\"p\">}<\/span> <span class=\"k\">=&gt;<\/span> <span class=\"p\">{<\/span>\n                <span class=\"k\">let<\/span> <span class=\"n\">classifier<\/span> <span class=\"o\">=<\/span> <span class=\"k\">self<\/span><span class=\"nf\">.get_by_id<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"n\">id<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"p\">;<\/span>\n                <span class=\"nn\">ClassifierAction<\/span><span class=\"p\">::<\/span><span class=\"nf\">ClassifierRenameCanceled<\/span><span class=\"p\">(<\/span>\n                    <span class=\"n\">EditNameDto<\/span> <span class=\"p\">{<\/span> <span class=\"n\">id<\/span><span class=\"p\">,<\/span> <span class=\"n\">new_name<\/span><span class=\"p\">:<\/span> <span class=\"n\">classifier<\/span><span class=\"py\">.name<\/span> <span class=\"p\">}<\/span>\n                <span class=\"p\">)<\/span>\n            <span class=\"p\">},<\/span>\n            <span class=\"c1\">\/\/ return error if we don't know how to handle the action<\/span>\n            <span class=\"n\">_<\/span> <span class=\"k\">=&gt;<\/span> <span class=\"nn\">ClassifierAction<\/span><span class=\"p\">::<\/span><span class=\"n\">ClassifierRenameError<\/span>\n        <span class=\"p\">};<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">response<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/ handling of actions related to application workflow<\/span>\n<span class=\"nd\">#[async_trait]<\/span>\n<span class=\"k\">impl<\/span> <span class=\"n\">ActionHandler<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">ApplicationAction<\/span><span class=\"o\">&gt;<\/span> <span class=\"k\">for<\/span> <span class=\"n\">ClassifierService<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">handle_action<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"k\">self<\/span><span class=\"p\">,<\/span> <span class=\"n\">action<\/span><span class=\"p\">:<\/span> <span class=\"n\">ApplicationAction<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"n\">ApplicationAction<\/span> <span class=\"p\">{<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">response<\/span> <span class=\"o\">=<\/span> <span class=\"k\">match<\/span> <span class=\"n\">action<\/span> <span class=\"p\">{<\/span>\n            <span class=\"nn\">ApplicationAction<\/span><span class=\"p\">::<\/span><span class=\"n\">ApplicationReady<\/span> <span class=\"k\">=&gt;<\/span> <span class=\"p\">{<\/span>\n                <span class=\"c1\">\/\/ implementation omitted<\/span>\n            <span class=\"p\">},<\/span>\n            <span class=\"n\">_<\/span> <span class=\"k\">=&gt;<\/span> <span class=\"nn\">ApplicationAction<\/span><span class=\"p\">::<\/span><span class=\"n\">ApplicationLoadError<\/span>\n        <span class=\"p\">};<\/span>\n        <span class=\"k\">return<\/span> <span class=\"n\">response<\/span><span class=\"p\">;<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0627\u0644 \u0627\u0639\u0632\u0627\u0645 \u06a9\u0646\u0646\u062f\u0647 <em>ActionHandler<\/em> \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0646\u062d\u0648 \u0639\u062c\u06cc\u0628 \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f \u0627\u0645\u0627 \u0628\u0631\u0627\u06cc \u062a\u0639\u06cc\u06cc\u0646 \u0627\u062c\u0631\u0627\u06cc \u0635\u062d\u06cc\u062d \u0635\u0641\u062a \u0645\u0648\u0631\u062f \u0646\u06cc\u0627\u0632 \u0627\u0633\u062a.<\/p>\n<p>\u0628\u0627 <em>ActionDispatcher<\/em> \u0648\u06cc\u0698\u06af\u06cc\u060c \u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u0648\u0636\u0639\u06cc\u062a \u0628\u0631\u0646\u0627\u0645\u0647 Tauri \u062e\u0648\u062f \u0631\u0627 \u062a\u0639\u0631\u06cc\u0641 \u06a9\u0646\u06cc\u0645.  \u0627\u06cc\u0646 \u0641\u0642\u0637 \u0634\u0627\u0645\u0644 \u06cc\u06a9 \u0641\u0631\u0647\u0646\u06af \u0644\u063a\u062a \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u06cc\u06a9 \u062a\u0648\u0632\u06cc\u0639 \u06a9\u0646\u0646\u062f\u0647 \u062f\u0631 \u0647\u0631 \u062f\u0627\u0645\u0646\u0647 \u0627\u0642\u062f\u0627\u0645 \u0630\u062e\u06cc\u0631\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645.  \u062f\u0631 \u0646\u062a\u06cc\u062c\u0647\u060c \u0645\u0627 <em>ClassifierService<\/em> \u0628\u0627\u06cc\u062f \u062f\u0648 \u0628\u0627\u0631 \u062b\u0628\u062a \u0634\u0648\u062f \u0632\u06cc\u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0627\u0642\u062f\u0627\u0645\u0627\u062a \u062f\u0648 \u062f\u0627\u0645\u0646\u0647 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u062f. <\/p>\n<p>\u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0641\u0631\u0647\u0646\u06af \u0644\u063a\u062a \u062f\u0627\u0631\u0627\u06cc \u0645\u0642\u0627\u062f\u06cc\u0631 \u062e\u0648\u062f \u0627\u0633\u062a\u060c \u0627\u0632 an \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <em>\u0634\u0645\u0627\u0631\u0646\u062f\u0647 \u0645\u0631\u062c\u0639 \u0627\u062a\u0645\u06cc<\/em> (Arc) \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0645\u0631\u0627\u062c\u0639 \u062e\u062f\u0645\u0627\u062a \u0645\u0627.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code>\n<span class=\"c1\">\/\/ the application context our Tauri Commands will have access to<\/span>\n<span class=\"k\">struct<\/span> <span class=\"n\">ApplicationContext<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">action_dispatchers<\/span><span class=\"p\">:<\/span> <span class=\"n\">HashMap<\/span><span class=\"o\">&lt;<\/span><span class=\"nb\">String<\/span><span class=\"p\">,<\/span> <span class=\"nb\">Arc<\/span><span class=\"o\">&lt;<\/span><span class=\"k\">dyn<\/span> <span class=\"n\">ActionDispatcher<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">Sync<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">Send<\/span><span class=\"o\">&gt;&gt;<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"c1\">\/\/ initialize the application context with our action dispatchers<\/span>\n<span class=\"k\">impl<\/span> <span class=\"n\">ApplicationContext<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">new<\/span><span class=\"p\">()<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"k\">Self<\/span> <span class=\"p\">{<\/span> \n        <span class=\"c1\">\/\/ create our database and repository<\/span>\n        <span class=\"c1\">\/\/ note: to use BonsaiDB instead, replace the database and repository<\/span>\n        <span class=\"c1\">\/\/ here with the corresponding implementation<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">surreal_db<\/span> <span class=\"o\">=<\/span> <span class=\"nn\">Surreal<\/span><span class=\"p\">::<\/span><span class=\"nn\">new<\/span><span class=\"p\">::<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">File<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">(<\/span><span class=\"s\">\"umlboard.db\"<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\n        <span class=\"n\">surreal_db<\/span><span class=\"nf\">.use_ns<\/span><span class=\"p\">(<\/span><span class=\"s\">\"uml_ns\"<\/span><span class=\"p\">)<\/span><span class=\"nf\">.use_db<\/span><span class=\"p\">(<\/span><span class=\"s\">\"uml_db\"<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">repository<\/span> <span class=\"o\">=<\/span> <span class=\"nn\">Box<\/span><span class=\"p\">::<\/span><span class=\"nf\">new<\/span><span class=\"p\">(<\/span><span class=\"nn\">SurrealRepository<\/span><span class=\"p\">::<\/span><span class=\"nf\">new<\/span><span class=\"p\">(<\/span>\n            <span class=\"nn\">Box<\/span><span class=\"p\">::<\/span><span class=\"nf\">new<\/span><span class=\"p\">(<\/span><span class=\"n\">surreal_db<\/span><span class=\"p\">),<\/span> <span class=\"s\">\"classifiers\"<\/span><span class=\"p\">));<\/span>\n\n        <span class=\"c1\">\/\/ create the classifier application service<\/span>\n        <span class=\"k\">let<\/span> <span class=\"n\">service<\/span> <span class=\"o\">=<\/span> <span class=\"nn\">Arc<\/span><span class=\"p\">::<\/span><span class=\"nf\">new<\/span><span class=\"p\">(<\/span><span class=\"nn\">ClassifierService<\/span><span class=\"p\">::<\/span><span class=\"nf\">new<\/span><span class=\"p\">(<\/span><span class=\"n\">repository<\/span><span class=\"p\">));<\/span>\n        <span class=\"c1\">\/\/ setup our action dispatcher map and add the service for each<\/span>\n        <span class=\"c1\">\/\/ domain it can handle<\/span>\n        <span class=\"k\">let<\/span> <span class=\"k\">mut<\/span> <span class=\"n\">dispatchers<\/span><span class=\"p\">:<\/span> \n            <span class=\"n\">HashMap<\/span><span class=\"o\">&lt;<\/span><span class=\"nb\">String<\/span><span class=\"p\">,<\/span> <span class=\"nb\">Arc<\/span><span class=\"o\">&lt;<\/span><span class=\"k\">dyn<\/span> <span class=\"n\">ActionDispatcher<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">Sync<\/span> <span class=\"o\">+<\/span> <span class=\"nb\">Send<\/span><span class=\"o\">&gt;&gt;<\/span> <span class=\"o\">=<\/span> \n            <span class=\"nn\">HashMap<\/span><span class=\"p\">::<\/span><span class=\"nf\">new<\/span><span class=\"p\">();<\/span>\n        <span class=\"n\">dispatchers<\/span><span class=\"nf\">.insert<\/span><span class=\"p\">(<\/span><span class=\"n\">CLASSIFIER_DOMAIN<\/span><span class=\"nf\">.to_string<\/span><span class=\"p\">(),<\/span> <span class=\"n\">service<\/span><span class=\"nf\">.clone<\/span><span class=\"p\">());<\/span>\n        <span class=\"n\">dispatchers<\/span><span class=\"nf\">.insert<\/span><span class=\"p\">(<\/span><span class=\"n\">APPLICATION_DOMAIN<\/span><span class=\"nf\">.to_string<\/span><span class=\"p\">(),<\/span> <span class=\"n\">service<\/span><span class=\"nf\">.clone<\/span><span class=\"p\">());<\/span>\n        <span class=\"k\">Self<\/span> <span class=\"p\">{<\/span> <span class=\"n\">action_dispatchers<\/span><span class=\"p\">:<\/span> <span class=\"n\">dispatchers<\/span> <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0642\u0633\u0645\u062a \u0622\u062e\u0631 \u062f\u0648\u0628\u0627\u0631\u0647 \u0622\u0633\u0627\u0646 \u0627\u0633\u062a: \u0645\u0627 \u062f\u0633\u062a\u0648\u0631 Tauri \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0631\u0648\u0632 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u0648 \u0628\u0633\u062a\u0647 \u0628\u0647 \u0639\u0645\u0644\u06a9\u0631\u062f \u0648\u0631\u0648\u062f\u06cc\u060c \u062a\u0648\u0632\u06cc\u0639 \u06a9\u0646\u0646\u062f\u0647 \u0635\u062d\u06cc\u062d \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u0645\u06cc \u06a9\u0646\u06cc\u0645:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight rust\"><code><span class=\"nd\">#[tauri::command]<\/span>\n<span class=\"k\">async<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">ipc_message<\/span><span class=\"p\">(<\/span><span class=\"n\">message<\/span><span class=\"p\">:<\/span> <span class=\"n\">IpcMessage<\/span><span class=\"p\">,<\/span> \n    <span class=\"n\">context<\/span><span class=\"p\">:<\/span> <span class=\"n\">State<\/span><span class=\"o\">&lt;<\/span><span class=\"nv\">'_<\/span><span class=\"p\">,<\/span> <span class=\"n\">ApplicationContext<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">Result<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">IpcMessage<\/span><span class=\"p\">,<\/span> <span class=\"p\">()<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\n    <span class=\"k\">let<\/span> <span class=\"n\">dispatcher<\/span> <span class=\"o\">=<\/span> <span class=\"n\">context<\/span><span class=\"py\">.action_dispatchers<\/span><span class=\"nf\">.get<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"n\">message<\/span><span class=\"py\">.domain<\/span><span class=\"p\">)<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">();<\/span>\n    <span class=\"k\">let<\/span> <span class=\"n\">response<\/span> <span class=\"o\">=<\/span> <span class=\"n\">dispatcher<\/span><span class=\"nf\">.dispatch_action<\/span><span class=\"p\">(<\/span>\n        <span class=\"n\">message<\/span><span class=\"py\">.domain<\/span><span class=\"nf\">.to_string<\/span><span class=\"p\">(),<\/span>\n        <span class=\"n\">message<\/span><span class=\"py\">.action<\/span><span class=\"p\">)<\/span><span class=\"k\">.await<\/span><span class=\"p\">;<\/span>\n    <span class=\"nf\">Ok<\/span><span class=\"p\">(<\/span><span class=\"n\">IpcMessage<\/span> <span class=\"p\">{<\/span>\n        <span class=\"n\">domain<\/span><span class=\"p\">:<\/span> <span class=\"n\">message<\/span><span class=\"py\">.domain<\/span><span class=\"p\">,<\/span>\n        <span class=\"n\">action<\/span><span class=\"p\">:<\/span> <span class=\"n\">response<\/span>\n    <span class=\"p\">})<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u0648\u0627\u0631\u062f \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0648 \u0634\u0645\u0627 \u0645\u06cc \u0631\u0648\u06cc\u062f: <br \/>\u06a9\u0627\u0631 \u0628\u0633\u06cc\u0627\u0631 \u06a9\u0645\u06cc \u0628\u0648\u062f\u060c \u0627\u0645\u0627 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0627\u06a9\u0646\u0648\u0646 \u0628\u0627 \u0647\u0645 \u0647\u0645\u0627\u0647\u0646\u06af \u0627\u0633\u062a:<br \/>\u0645\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u0645\u0648\u062c\u0648\u062f\u06cc\u062a\u200c\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0627\u0632 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u06a9\u0646\u06cc\u0645\u060c \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u0645 \u0646\u0627\u0645 \u06cc\u06a9 \u0645\u0648\u062c\u0648\u062f\u06cc\u062a \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u062f\u060c \u0648 \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u0631\u0627 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062e\u0648\u062f \u0627\u062f\u0627\u0645\u0647 \u062f\u0647\u06cc\u0645 \u062a\u0627 \u062f\u0641\u0639\u0647 \u0628\u0639\u062f \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0634\u0631\u0648\u0639 \u0628\u0647 \u06a9\u0627\u0631 \u06a9\u0646\u062f \u0647\u0645\u0686\u0646\u0627\u0646 \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0628\u0627\u0634\u062f.<\/p>\n<p>\u06a9\u0627\u0631\u0647\u0627\u06cc \u0627\u0646\u062c\u0627\u0645 \u0634\u062f\u0647!<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%86%D8%AA%DB%8C%D8%AC%D9%87\"><\/span>\n<p>  \u0646\u062a\u06cc\u062c\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0627\u06cc\u0646 \u067e\u0633\u062a\u060c \u06cc\u06a9 \u0627\u062b\u0628\u0627\u062a \u0645\u0641\u0647\u0648\u0645 \u0628\u0631\u0627\u06cc \u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u062d\u0641\u0638 \u0648\u0636\u0639\u06cc\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0645\u0627 \u0628\u0647 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Tauri \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u06cc\u0645.  \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u0648\u06cc\u0698\u06af\u06cc \u0645\u062e\u0632\u0646\u060c \u0645\u0627 \u062a\u0648\u0627\u0646\u0633\u062a\u06cc\u0645 \u0645\u0646\u0637\u0642 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0627 \u0627\u0632 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062e\u0648\u062f \u062c\u062f\u0627 \u06a9\u0646\u06cc\u0645\u060c \u0648 \u0628\u0647 \u0645\u0627 \u0627\u062c\u0627\u0632\u0647 \u0645\u06cc \u062f\u0647\u062f \u0628\u06cc\u0646 \u0628\u0627\u0637\u0646 \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062c\u0627\u0628\u062c\u0627 \u0634\u0648\u06cc\u0645.<\/p>\n<p>\u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0631\u0627\u0628\u0637 \u0645\u062e\u0632\u0646 \u0645\u0627 \u0646\u0633\u0628\u062a\u0627\u064b \u0645\u06cc\u0646\u06cc\u0645\u0627\u0644\u06cc\u0633\u062a\u06cc \u0627\u0633\u062a\u060c \u0627\u0645\u0627 \u0633\u0646\u0627\u0631\u06cc\u0648\u0647\u0627\u06cc \u067e\u06cc\u0686\u06cc\u062f\u0647 \u062a\u0631 \u0642\u0637\u0639\u0627\u064b \u0628\u0647 API \u067e\u0631\u0633 \u0648 \u062c\u0648\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u062a\u0631\u06cc \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u0646\u062f.  \u0627\u0645\u0627 \u0627\u06cc\u0646 \u0686\u06cc\u0632\u06cc \u0627\u0633\u062a \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u067e\u0633\u062a \u062f\u06cc\u06af\u0631 &#8230;<\/p>\n<p>\u0647\u0645\u0686\u0646\u06cc\u0646\u060c \u0645\u0647\u0627\u062c\u0631\u062a \u0627\u0632 \u06cc\u06a9 \u0645\u062f\u0644 \u062f\u0627\u0645\u0646\u0647 \u0642\u062f\u06cc\u0645\u06cc \u0628\u0647 \u06cc\u06a9 \u0645\u062f\u0644 \u062c\u062f\u06cc\u062f\u060c \u0645\u0648\u0636\u0648\u0639 \u062e\u0648\u0628 \u062f\u06cc\u06af\u0631\u06cc \u0628\u0631\u0627\u06cc \u0645\u0642\u0627\u0644\u0647 \u0628\u0639\u062f\u06cc \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f. <\/p>\n<p>\u062a\u0648 \u0686\u0637\u0648\u0631\u061f  \u0622\u06cc\u0627 \u0642\u0628\u0644\u0627\u064b \u0628\u0627 Tauri \u0648 Rust \u06a9\u0627\u0631 \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f\u061f<br \/>\u0644\u0637\u0641\u0627 \u062a\u062c\u0631\u0628\u0647 \u062e\u0648\u062f \u0631\u0627 \u062f\u0631 \u0646\u0638\u0631\u0627\u062a \u06cc\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u062a\u0648\u06cc\u06cc\u062a\u0631 \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u0628\u06af\u0630\u0627\u0631\u06cc\u062f <a href=\"https:\/\/twitter.com\/UMLBoard\" rel=\"nofollow noopener\" target=\"_blank\">@umlboard<\/a>.<\/p>\n<hr\/>\n<p><em>\u062a\u0635\u0648\u06cc\u0631 \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u062d\u0644\u06cc \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647 \u0628\u0627 Bing Image Creator.<\/em><br \/><em>\u06a9\u062f \u0645\u0646\u0628\u0639 \u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u062f\u0631 Github \u0645\u0648\u062c\u0648\u062f \u0627\u0633\u062a.<\/em><\/p>\n<p><em>\u062f\u0631 \u0627\u0628\u062a\u062f\u0627 \u062f\u0631 https:\/\/umlboard.com \u0645\u0646\u062a\u0634\u0631 \u0634\u062f.<\/em><\/p>\n<\/p><\/div>\n<p><script async src=\"\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0628\u062e\u0634 2: \u0630\u062e\u06cc\u0631\u0647 \u0633\u0627\u0632\u06cc \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0645\u062d\u0644\u06cc &#8211; \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062f\u0631 Rust \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Tauri. TL;DR: \u0686\u0646\u062f\u06cc\u0646 \u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062a\u0639\u0628\u06cc\u0647 \u0634\u062f\u0647 \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u0641\u0627\u06cc\u0644 \u0628\u0631\u0627\u06cc Rust \u062f\u0631 \u062f\u0633\u062a\u0631\u0633 \u0647\u0633\u062a\u0646\u062f. \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0628\u0647 \u0628\u0631\u0631\u0633\u06cc \u0628\u0631\u062e\u06cc \u0627\u0632 \u0622\u0646\u0647\u0627 \u0645\u06cc \u067e\u0631\u062f\u0627\u0632\u062f \u0648 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0622\u0646\u0647\u0627 \u0631\u0627 \u062f\u0631 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":20038,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-20037","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/20037","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=20037"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/20037\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/20038"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=20037"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=20037"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=20037"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}