2017-10-18 15 views
2

Je veux remplir une variable mutable avec les résultats de correspondant à une variable d'environnement:Comment remplir une instance struct avec des résultats de correspondance lorsque vous utilisez envie?

struct Environment { 
    some_env_variable_1: String, 
    some_env_variable_2: String, 
    some_env_variable_3: String, 
    some_env_variable_4: String, 
} 

match envy::from_env::<Environment>() { 
    Ok(environment) => println!("{:#?}", environment), 
    Err(error) => panic!("{:#?})", error), 
}; 

//where I'm stuck 
let mut e = Environment { 
    some_env_variable_1: // want this to be from match 
}; 

Répondre

4

Vous appelez la méthode de l'envie qui fait tout l'analyse syntaxique et de la population pour vous. Le problème est que vous jeter le résultat - il est seulement disponible à l'intérieur du match:

match envy::from_env::<Environment>() { 
    Ok(environment) => println!("{:#?}", environment), // gone now 
    Err(error) => panic!("{:#?})", error), 
}; 

Vous ne devez pas jeter:

let environment = match envy::from_env::<Environment>() { 
    Ok(environment) => { 
     println!("{:#?}", environment); 
     environment // Now the entire `match` evaluates to `environment` 
    } 
    Err(error) => panic!("{:#?})", error), 
}; 

Ou, plus idiomatiques, il suffit d'utiliser expect:

let environment: Environment = envy::from_env() 
    .expect("Couldn't parse environment"); 

println!("{:#?}", environment); 

Exemple complet:

extern crate serde; 
#[macro_use] 
extern crate serde_derive; 
extern crate envy; 

#[derive(Debug, Deserialize)] 
struct Environment { 
    username: String, 
    port: u16, 
} 

fn main() { 
    let mut environment: Environment = envy::from_env() 
     .expect("Couldn't parse environment variables"); 

    println!("{:#?}", environment); 
} 
$ USERNAME=overflow PORT=8787 cargo run 

Environment { 
    username: "overflow", 
    port: 8787 
} 
+1

Merci beaucoup, ne se rendent pas compte qu'il l'a jeté à la fin de la ligne. J'ai essayé le moins idiomatique, mais je ne l'ai pas bloqué, donc je l'ai toujours jeté. – Joe

+1

@Joe Pour être clair, ce n'est pas le '{}' qui fait la différence entre jeter ou pas, c'est le 'let environment =' avant l'expression 'match'. 'Ok (environment) => environment,' aurait aussi bien fonctionné. (En supposant que c'est ce que vous entendiez par "bloquer") – trentcl

+0

@trentcl Je vois. Oui, j'ai remarqué les accolades et je viens de réaliser que les valeurs de retour dans la rouille sont généralement implicites avec la dernière déclaration, donc je vois que vous avez '' '' environment''' après le '' 'Ok (environment) =>' '' '' '' '' '' '' '' '' '' '' ' Je vous remercie! – Joe