Share
Embed
RustでAPIを叩くCLIを作る at [RustのLT会! Rust入門者の集い #4]
「RustのLT会! Rust入門者の集い #4」で発表した内容です。
Kazuki Higashiguchi
December 18, 2017
Transcript
15 slides
-
さっとRUST でAPI を叩くCLI ツールを作 さっとRUST でAPI を叩くCLI ツールを作 る る
by @Khigashiguchi -
:社内で利用してるドキュメント共有サ ービス ローカルにあるmarkdown ファイルを即座にター ミナルから投稿したい。 Rust で書く バイナリで動作するから便利にできそう。 便利なライブラリが揃っていそう。 Khigashiguchi/docbase-cli
DocBase $ docbase-cli post hello.md "This is the first post from comma POST: 201 Created Success! The url posted is "<url>". -
コマンドラインオプション解析 コマンドラインオプション解析 こんな感じで だったらヘルプメッセージを出し たりしてほしい。 $ 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. -
コマンドラインオプション解析 コマンドラインオプション解析 を利用 Deserialize を実装した構造体を使ってヘルプメ ッセージの解析結果を受けとる。 docopt_macro を使えばヘルプメッセージを解 析して結果を受け取る構造体を自動生成でき る。(nightly
限定) 手軽さを重視してdocopt にした。 その他: ・ docopt getopts clap-rs -
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. "; -
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); } -
リクエストボディの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(); -
HTTPS リクエスト HTTPS リクエスト を利用する https アクセスなので、 も利用する。 に基本的な使い方のチュートリ アルがあるので入りやすい。
その他: hyper hyper-tls https://hyper.rs/ reqwest -
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); // 送信 -
実装結果 実装結果 ローカルのファイルを指定して投稿することがで きました。 $ 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" -
まとめ まとめ 一通りのcrate が用意されていたのでさっと作れ た Rust を触ってみて ゆるく使えるPHP に比べて、意識することが多 い。
コンパイラに間違えない書き方を教えてもら える感じは新鮮。 所有権の概念は結構なタイミングで引っかか る 型の違いでコンパイラ通らないこと多々。 言語仕様への理解はまだまだなので精進した い。