2016-10-22 9 views
0

Rustを学んで何か役に立つことを試みている間、私はSAFE API call for DNS:Add serviceを作りたいと思っています。 APIは明確に定義されており、その本体はいくつかの文字列であり、2つのオプションに制限された1つの変数である単純なPUT要求である必要があります。CLI引数をenumに制限する方法はありますか?

私は、文字列を使用するのではなく、実際の制限を持つput本体の構造体と列挙型を定義することを検討しました。私は、現実を近く定義することを望むので、より良い習慣です。

私は近くにいる必要がありますが、その後、入力を列挙型に制限しようとして不一致があると思います。 3番目の引数は 'drive'または 'app'のみでRootPathVariantとする必要があります。

だから、私はarguments=arg[2] の試合でroot_pathを割り当てるが、試合の左側を気圧まで探しています、それはStringを望んでいる場所間違っている、&'static strです。

列挙型が定義されています:

pub enum RootPathVariant { App, Drive } 

impl RootPathVariant { 
    pub fn as_str(&self) -> &str { 
     match self { 
      &RootPathVariant::App => "app", 
      &RootPathVariant::Drive => "drive", 
     } 
    } 
} 

私はその列挙の内容を受け入れるように、この試合の左側に置く必要がありますどのように?

let mut root_path: RootPathVariant = RootPathVariant::Drive; 
match args[2].to_string() { 
    "drive" => { root_path = RootPathVariant::Drive }, 
    "app" => { root_path = RootPathVariant::App }, 
    _ => { println!("Error: root_path not [drive | app]"); return } 
}; 

let put_body = AddServiceBody { 
    long_Name: args[0], 
    service_Name: args[1], 
    root_Path: root_path, 
    service_Home_Dir_Path: args[3] 
}; 

ありがとうございました!

+0

'string.as_ref()'を使うと、 'String'から'&str'を取得し、それをマッチで使うことができます。しかし、 'args'のタイプは何ですか? 'to_string()'は既に '&str'を持っていれば不要です。 –

+1

正確なエラーメッセージと[MCVE]を追加してください。あなたは答えを得る可能性がより高いです:) –

+0

@Pavel Strakhov argsのタイプは、貨物から簡単に続く:getoptsをVec として返します。動作するように見える 'args [2] .as_str()'に当てはまる明白なオプションがありませんでした! –

答えて

0

答えはmatch args[2].as_str()にあるようです。

関連する問題