Se connecter

Informatique

Programmation

Sujet : [Rust] Renvoyer un Result avec une valeur
1
RegleGraduee
Niveau 50
13 septembre 2019 à 23:46:23

Hello

Je sais pas s'il y a des experts Rust ici mais je tente toujours :hap:
J'arrive pas à comprendre comment je fais pour renvoyer une valeur tout en gérant les erreurs en renvoyant un Result. Car le compilateur m'oblige à spécifier le E de Resultat<T,E> alors que pourtant on peut renvoyer Result<()> :(

J'ai repris le code d'ici: https://rust-lang-nursery.github.io/rust-cookbook/web/clients/download.html

extern crate reqwest;
extern crate tempdir;

use std::io::copy;
use std::fs::File;
use tempdir::TempDir;

fn run() -> Result<()> {
    let tmp_dir = TempDir::new("example")?;
    let target = "https://www.rust-lang.org/logos/rust-logo-512x512.png";
    let mut response = reqwest::get(target)?;

    let mut dest = {
        let fname = response
            .url()
            .path_segments()
            .and_then(|segments| segments.last())
            .and_then(|name| if name.is_empty() { None } else { Some(name) })
            .unwrap_or("tmp.bin");

        println!("file to download: '{}'", fname);
        let fname = tmp_dir.path().join(fname);
        println!("will be located under: '{:?}'", fname);
        File::create(fname)?
    };
    copy(&mut response, &mut dest)?;
    Ok(())
}

Sauf que moi j'ai besoin de renvoyer un String
donc je voudrais changer le prototype de la fonction en fn run() -> Result<String> , mais je peux pas, et si je spécifie le type d'erreur, je pourrais plus utiliser les ? pour gérer les exceptions, car je devrais les remplacer par des excepts :(

Une idée de comment je peux faire ?

godrik
Niveau 22
14 septembre 2019 à 01:00:09

(desole, je ne fais pas de rust.)

AtmelAVR
Niveau 4
14 septembre 2019 à 10:17:52

Essaie Result<String, Box<std::error::Error>>
https://doc.rust-lang.org/rust-by-example/error/multiple_error_types/boxing_errors.html

Dark_Chouhartem
Niveau 10
14 septembre 2019 à 11:04:59

D'ailleurs, j'ai testé le code donné dans le cookbook, mais renvoyer Result<String> fonctionne chez moi.

Si tu regardes dans le préambule, le type Result<T> est généré par error_chain : https://docs.rs/error-chain/0.12.1/error_chain/index.html#declaring-error-types

Et en faisant un test rapide (en remplaçant le return par Ok(String::from(":noel:")) et le type renvoyé par Result<String>) ça roulait sans soucis :(

Repost parce que j'avais pas mis mon vpn pour les liens :hap:

RegleGraduee
Niveau 50
14 septembre 2019 à 16:03:08

Le 14 septembre 2019 à 11:04:59 Dark_Chouhartem a écrit :
D'ailleurs, j'ai testé le code donné dans le cookbook, mais renvoyer Result<String> fonctionne chez moi.

Si tu regardes dans le préambule, le type Result<T> est généré par error_chain : https://docs.rs/error-chain/0.12.1/error_chain/index.html#declaring-error-types

Et en faisant un test rapide (en remplaçant le return par Ok(String::from(":noel:")) et le type renvoyé par Result<String>) ça roulait sans soucis :(

Repost parce que j'avais pas mis mon vpn pour les liens :hap:

Pour moi ça marche pas :hap:
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=53c677844e1e1f4065a348f5a77d947c

error[E0107]: wrong number of type arguments: expected 2, found 1
 --> src/main.rs:5:16
  |
5 | fn Coucou() -> Result<String>
  |                ^^^^^^^^^^^^^^ expected 2 type arguments

Le 14 septembre 2019 à 10:17:52 AtmelAVR a écrit :
Essaie Result<String, Box<std::error::Error>>
https://doc.rust-lang.org/rust-by-example/error/multiple_error_types/boxing_errors.html

Merci ça marche :ok: Même si j'ai un warning
Par contre je comprends pas la logique d'autoriser la syntaxe Result<()> et pas Result<String> :(

AtmelAVR
Niveau 4
14 septembre 2019 à 17:03:54

Le 14 septembre 2019 à 16:03:08 RegleGraduee a écrit :
Merci ça marche :ok: Même si j'ai un warning

Il faut ajouter dyn devant Error: Result<String, Box<dyn std::error::Error>>

Par contre je comprends pas la logique d'autoriser la syntaxe Result<()> et pas Result<String> :(

Comme Dark_Chouhartem, l'a dit c'est la macro error_chain! qui génère le type Result.
https://docs.rs/error-chain/0.12.1/error_chain/index.html#returning-new-errors

Note that the return type is the typedef Result, which is defined by the macro as pub type Result<T> = ::std::result::Result<T, Error>

Le Result utilsé dans l'exemple du cookbook est un typedef de std::result::Result<T, E> qui ne prend que le type T en paramètre.

1
Sujet : [Rust] Renvoyer un Result avec une valeur
   Retour haut de page
Consulter la version web de cette page