Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RustでAPIを叩くCLIを作る at [RustのLT会! Rust入門者の集い #4]

RustでAPIを叩くCLIを作る at [RustのLT会! Rust入門者の集い #4]

「RustのLT会! Rust入門者の集い #4」で発表した内容です。

Kazuki Higashiguchi

December 18, 2017
Tweet

More Decks by Kazuki Higashiguchi

Other Decks in Technology

Transcript

  1. コマンドラインオプション解析 コマンドラインオプション解析 こんな感じで だったらヘルプメッセージを出し たりしてほしい。 $ docbase-cli -h DocBase API

    Command Line Interface Application USAGE: docbase-cli docbase-cli post <post-file-path>... <post-title>... docbase-cli (-h | --help) docbase-cli --version Options: -h, --help Show this screen. --version Show version.
  2. DOCOPT 使用例(1) DOCOPT 使用例(1) ヘルプメッセージを定義。 const USAGE: &'static str =

    " DocBase API Command Line Interface Application USAGE: docbase-cli docbase-cli post <post-file-path>... <post-title>... docbase-cli (-h | --help) docbase-cli --version Options: -h, --help Show this screen. --version Show version. ";
  3. DOCOPT 使用例(2) DOCOPT 使用例(2) 解析結果を受け取る構造体を用意。 args.cmd_post, args.arg_post_file_path のような形 で使用できる。 #[derive(Debug,

    Deserialize)] pub struct Args { cmd_post: bool, arg_post_file_path: Vec<String>, arg_post_title: Vec<String>, } fn main() { let args: Args = Docopt::new(USAGE) .and_then(|d| d.deserialize()) .unwrap_or_else(|e| e.exit()); println!("{:?}", args); }
  4. リクエストボディのJSON を作る リクエストボディのJSON を作る json 構造を作るのに、 を利用。 json 構造を定義するDSL を利用できる。

    json 構造内のValue に変数を使いたい際に一番 手軽そうだった。 その他: ・ ただ、serde_json を別のところでに使っていた ので、json_macros を使った方が良さそうだっ た。 jsonway serde_json json_macros // json 構築 let json = jsonway::object(|json| { json.set("title", title.to_string()); json.set("body", body.to_string()); json.set("draft", "true".to_string()); }).unwrap().to_string();
  5. HYPER 使用例 HYPER 使用例 // HTTPS 生成 let mut core

    = Core::new().unwrap(); let handle = core.handle(); let client = Client::configure() .connector(HttpsConnector::new(1, &handle).unwrap()) .build(&handle); // 生成 let uri = docbase_uri.parse().unwrap(); let mut req = Request::new(Method::Post, uri); // 付与 req.headers_mut().set(ContentType::json()); // 付与 req.set_body(json); // 送信
  6. 実装結果 実装結果 ローカルのファイルを指定して投稿することがで きました。 $ docbase-cli post hello.md "This is

    the first post from comma POST: 201 Created Success! The url posted is "https://domain.docbase.io/1234567"
  7. まとめ まとめ 一通りのcrate が用意されていたのでさっと作れ た Rust を触ってみて ゆるく使えるPHP に比べて、意識することが多 い。

    コンパイラに間違えない書き方を教えてもら える感じは新鮮。 所有権の概念は結構なタイミングで引っかか る 型の違いでコンパイラ通らないこと多々。 言語仕様への理解はまだまだなので精進した い。