{"id":1855,"date":"2022-09-06T21:16:07","date_gmt":"2022-09-06T19:16:07","guid":{"rendered":"http:\/\/www.fabienm.eu\/wordpress\/?p=1855"},"modified":"2022-09-06T21:16:08","modified_gmt":"2022-09-06T19:16:08","slug":"retour-de-string-en-rust","status":"publish","type":"post","link":"https:\/\/www.fabienm.eu\/wordpress\/2022\/09\/06\/retour-de-string-en-rust\/","title":{"rendered":"Retour de String en Rust"},"content":{"rendered":"\n<p>Alors voila, je veux \u00e9crire une fonction qui appelle une commande shell et retourne la cha\u00eene de caract\u00e8res.<\/p>\n\n\n\n<p>Avec la cagette standard <a href=\"https:\/\/doc.rust-lang.org\/std\/process\/struct.Command.html\">std::process::Command<\/a> c&rsquo;est plut\u00f4t simple il suffit de faire \u00e7a :<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php \"><span class=\"hljs-keyword\">use<\/span> <span class=\"hljs-title\">std<\/span>::<span class=\"hljs-title\">process<\/span>::<span class=\"hljs-title\">Command<\/span>;\n<span class=\"hljs-comment\">\/\/..<\/span>\n    let _cmdret = Command::new(<span class=\"hljs-string\">\"cd-discid\"<\/span>)\n                            .output()\n                            .expect(<span class=\"hljs-string\">\"La commande cd-discid a \u00e9chou\u00e9e\"<\/span>);\n  \n<span class=\"hljs-comment\">\/\/..<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>L&rsquo;affichage de _cmdret avec un <a href=\"https:\/\/doc.rust-lang.org\/std\/macro.println.html\">println!<\/a> qui va bien me donne la forme de la structure retourn\u00e9e :<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript \">println!(<span class=\"hljs-string\">\"{:?}\"<\/span>, &amp;_cmdret);\n<span class=\"hljs-comment\">\/\/:Sortie -&gt;<\/span>\nOutput { <span class=\"hljs-attr\">status<\/span>: ExitStatus(unix_wait_status(<span class=\"hljs-number\">0<\/span>)), <span class=\"hljs-attr\">stdout<\/span>: <span class=\"hljs-string\">\"30027f05 5 150 2422 15072 29219 44022 641\\n\"<\/span>, <span class=\"hljs-attr\">stderr<\/span>: <span class=\"hljs-string\">\"\"<\/span> }\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Pour le moment c&rsquo;est assez simple, si je veux r\u00e9cup\u00e9rer la cha\u00eene de caract\u00e8res, il me suffit de prendre le champs <code>stdout<\/code> :<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript \">println!(<span class=\"hljs-string\">\"{:?}\"<\/span>, &amp;_cmdret.stdout);\n<span class=\"hljs-comment\">\/\/...<\/span>\n&#91;<span class=\"hljs-number\">51<\/span>, <span class=\"hljs-number\">48<\/span>, <span class=\"hljs-number\">48<\/span>, <span class=\"hljs-number\">50<\/span>, <span class=\"hljs-number\">55<\/span>, <span class=\"hljs-number\">102<\/span>, <span class=\"hljs-number\">48<\/span>, <span class=\"hljs-number\">53<\/span>, <span class=\"hljs-number\">32<\/span>, <span class=\"hljs-number\">53<\/span>, <span class=\"hljs-number\">32<\/span>, <span class=\"hljs-number\">49<\/span>, <span class=\"hljs-number\">53<\/span>, <span class=\"hljs-number\">48<\/span>, <span class=\"hljs-number\">32<\/span>, <span class=\"hljs-number\">50<\/span>, <span class=\"hljs-number\">52<\/span>, <span class=\"hljs-number\">50<\/span>, <span class=\"hljs-number\">50<\/span>, <span class=\"hljs-number\">32<\/span>, <span class=\"hljs-number\">49<\/span>, <span class=\"hljs-number\">53<\/span>, <span class=\"hljs-number\">48<\/span>, <span class=\"hljs-number\">55<\/span>, <span class=\"hljs-number\">50<\/span>, <span class=\"hljs-number\">32<\/span>, <span class=\"hljs-number\">50<\/span>, <span class=\"hljs-number\">57<\/span>, <span class=\"hljs-number\">50<\/span>, <span class=\"hljs-number\">49<\/span>, <span class=\"hljs-number\">57<\/span>, <span class=\"hljs-number\">32<\/span>, <span class=\"hljs-number\">52<\/span>, <span class=\"hljs-number\">52<\/span>, <span class=\"hljs-number\">48<\/span>, <span class=\"hljs-number\">50<\/span>, <span class=\"hljs-number\">50<\/span>, <span class=\"hljs-number\">32<\/span>, <span class=\"hljs-number\">54<\/span>, <span class=\"hljs-number\">52<\/span>, <span class=\"hljs-number\">49<\/span>, <span class=\"hljs-number\">10<\/span>]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Rhaa, mais pourquoi \u00e7a s&rsquo;est transform\u00e9 en vecteur de <a href=\"https:\/\/doc.rust-lang.org\/std\/primitive.u8.html\">u8<\/a> ?!<\/p>\n\n\n\n<p>Allons bon, convertissons avec <a href=\"https:\/\/doc.rust-lang.org\/std\/str\/fn.from_utf8.html\">std::str<\/a> :<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript \">use std::str\n<span class=\"hljs-comment\">\/\/\/<\/span>\n    println!(<span class=\"hljs-string\">\"{:?}\"<\/span>, <span class=\"hljs-attr\">str<\/span>::from_utf8(&amp;_cmdret.stdout));\n<span class=\"hljs-comment\">\/\/\/sortie -&gt;<\/span>\nOk(<span class=\"hljs-string\">\"30027f05 5 150 2422 15072 29219 44022 641\\n\"<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>On obtient donc une sortie de type <a href=\"https:\/\/doc.rust-lang.org\/std\/result\/enum.Result.html\">Result<\/a> non ? Notre fonction doit pouvoir s&rsquo;\u00e9crire comme \u00e7a alors :<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript \"><span class=\"hljs-comment\">\/\/\/ Lit le num\u00e9ro unique du CD se trouvant dans le lecteur<\/span>\npub fn get_discid() -&gt; Result&lt;<span class=\"hljs-built_in\">String<\/span>, Box&lt;dyn <span class=\"hljs-built_in\">Error<\/span>&gt;&gt; {\n    <span class=\"hljs-keyword\">let<\/span> _cmdret = Command::<span class=\"hljs-keyword\">new<\/span>(<span class=\"hljs-string\">\"cd-discid\"<\/span>)\n                            .output()\n                            .expect(<span class=\"hljs-string\">\"La commande cd-discid a \u00e9chou\u00e9e\"<\/span>);\n\n    str::from_utf8(&amp;_cmdret.stdout)\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Sauf que non, ce que je croyais \u00eatre un <a href=\"https:\/\/doc.rust-lang.org\/rust-by-example\/custom_types\/enum.html\">enum<\/a> \u00abResult\u00bb c&rsquo;est transform\u00e9 en une cha\u00eene de caract\u00e8res <a href=\"https:\/\/doc.rust-lang.org\/std\/str\/\">&amp;str<\/a> :<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php \"><span class=\"hljs-number\">22<\/span> |     str::from_utf8(&amp;_cmdret.stdout)\n   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `std::string::String`, found `&amp;str`\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Rajoutons un <a href=\"https:\/\/replit.com\/talk\/ask\/What-is-Ok-in-Rust\/137000\">Ok()<\/a> pour lui faire plaisir alors :<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php \"><span class=\"hljs-number\">22<\/span> |     Ok(str::from_utf8(&amp;_cmdret.stdout))\n   |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `std::string::String`, found enum `Result`\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Et c&rsquo;est l\u00e0 que je commence \u00e0 perdre pied, bin oui t&rsquo;as trouv\u00e9 un enum Result, puisque c&rsquo;est \u00e7a que j&rsquo;attends en retour patate !<\/p>\n\n\n\n<p>En browsant d\u00e9sesp\u00e9r\u00e9ment le web j&rsquo;ai cru trouver qu&rsquo;il fallait faire un <a href=\"https:\/\/doc.rust-lang.org\/rust-by-example\/flow_control\/match.html\">match<\/a> sur l&rsquo;enum pour retourner un nouvel enum (mais j&rsquo;ai pas compris pourquoi le premier ne convenait pas):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript \"><span class=\"hljs-comment\">\/\/\/ Lit le num\u00e9ro unique du CD se trouvant dans le lecteur<\/span>\npub fn get_discid() -&gt; Result&lt;<span class=\"hljs-built_in\">String<\/span>, Box&lt;dyn <span class=\"hljs-built_in\">Error<\/span>&gt;&gt; {\n    <span class=\"hljs-keyword\">let<\/span> _cmdret = Command::<span class=\"hljs-keyword\">new<\/span>(<span class=\"hljs-string\">\"cd-discid\"<\/span>)\n                            .output()\n                            .expect(<span class=\"hljs-string\">\"La commande cd-discid a \u00e9chou\u00e9e\"<\/span>);\n\n    match str::from_utf8(&amp;_cmdret.stdout) {\n        Ok(v) =&gt; Ok(v.to_string()),\n        Err(e) =&gt; Err(e.into())\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Langage du code\u00a0:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>\u00c0 noter qu&rsquo;il est possible de remplacer le <a href=\"https:\/\/doc.rust-lang.org\/std\/string\/trait.ToString.html\">to_string()<\/a> en<a href=\"https:\/\/doc.rust-lang.org\/std\/convert\/trait.Into.html\"> into()<\/a> dans le <code>Ok()<\/code> mais pas pour le <code>Err()<\/code>.<\/p>\n\n\n\n<p>Bon maintenant \u00e7a marche. Mais il me reste un go\u00fbt amer de celui qui n&rsquo;a pas compris ce qu&rsquo;il a \u00e9crit. Et j&rsquo;ai la d\u00e9sagr\u00e9able impression d&rsquo;avoir tartin\u00e9 du code pour pas grand chose !<\/p>\n\n\n\n<p>On doit pouvoir faire plus simple non ?<\/p>\n\n\n\n<p>Bref, la route est encore longue, et c&rsquo;est pas ce soir que je verrais mes<a href=\"https:\/\/github.com\/Martoni\/RecetteDHistoire\"> recettes d&rsquo;histoires<\/a> termin\u00e9es \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Alors voila, je veux \u00e9crire une fonction qui appelle une commande shell et retourne la cha\u00eene de caract\u00e8res. Avec la cagette standard std::process::Command c&rsquo;est plut\u00f4t simple il suffit de faire \u00e7a : L&rsquo;affichage de _cmdret avec un println! qui va &hellip; <a href=\"https:\/\/www.fabienm.eu\/wordpress\/2022\/09\/06\/retour-de-string-en-rust\/\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[263,143,191,276],"class_list":["post-1855","post","type-post","status-publish","format-standard","hentry","category-non-classe","tag-humeur","tag-programmation","tag-rust","tag-string"],"_links":{"self":[{"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/1855","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/comments?post=1855"}],"version-history":[{"count":4,"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/1855\/revisions"}],"predecessor-version":[{"id":1859,"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/posts\/1855\/revisions\/1859"}],"wp:attachment":[{"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/media?parent=1855"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/categories?post=1855"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fabienm.eu\/wordpress\/wp-json\/wp\/v2\/tags?post=1855"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}