👻

RustでEvansのwrapper commandを作ってdynamicにjsonを読み込む

2022/08/04に公開

3行で

  1. Evansでjsonファイルを用いてrequestを複数送るときresponseを次のrequestに使いたい
  2. 簡単なCLIをRust(Seahorse)で作ってみた
  3. 知見が欲しいのでコードについて御指摘頂けるととてもうれしい

es_command

これはなに?

Evans

Motivation

Evans has been created to use easier than other existing gRPC clients.
If you want to keep your product quality, you must use CI with gRPC testing, should not do use manual testing.
Evans will complete your other use cases just like:
Manually gRPC API inspection
To automate some tasks by scripting
The above use cases are corresponding to Evans's two modes, REPL mode, and CLI mode.

Evans とても便利ですよね。

こんなハイクオリティなものが無料で利用できるなんていい世の中になった。
&製作者に感謝の毎日です。

そんなEvans常習者の私ですが、日常的に利用させてもらうにあたって
以下のようなニーズが出てきました。

n番目のResponseをm番目のRequestに使いてぇ(n<m)

[
  {
    "name": "createGreet",
    "method": "api.v1.GreetService.CreateGreet",
    "body": {
      "name": "test",
      "nameJp": "テスト"
    }
  },
  {
    "method": "api.v1.GreetService.GetGreet",
    "body": {
    // ここで"CreateGreet"Response の"greetId"を使いたい。
      "greet_id": "$$createGreet.greetMessage.greetId"
    }
  }
]

これを達成するためにevansをwrapした簡単なCLIを作成したので、
備忘録を残そうというのがこの記事の趣旨です。

使い方

Install

GitHub Releaseでバイナリを配布しています。
いずれbrewとかでもinstallできるよう挑戦予定...

Command

es ./json_file_path ./another_json_file_path ./yet_another_file

Jsonファイル

  • SingleRequest(Object), MultiRequest(Array)どちらでも行けます

  • name,method,bodyにそれぞれ内容を記載します

  • name keyは省略可能です。Responseを変数として参照したい場合のみ設けるでOKです。

  • 変数として扱いたい語には$$を付けます

  • Objectへのアクセスは Object.keyで、ArrayへのアクセスはArray.2のようにindex(0~)で可能です

multi_request.json
[
  {
    "name": "Create",
    "method": "entpb.UserService.Create",
    "body": {
      "user": {
        "name": "testUser2",
        "email_address": "test2@test.com",
        "alias": "test2Alias"
      }
    }
  },
  {
    "method": "entpb.UserService.Get",
    "body": {
      "id": "$$Create.id"
    }
  },
  {
    "name": "Update",
    "method": "entpb.UserService.Update",
    "body": {
      "user": {
        "id": "$$Create.id",
        "name": "$$Create.alias"
      }
    }
  },
  {
    "method": "entpb.UserService.Delete",
    "body": {
      "id": "$$Create.id"
    }
  }
]

最後に

Rustでとても簡単なCLIを作ってみましたが、思ったよりは簡単に作ることができました。
メモリ効率とか全く気にせずclone()を多用してるからそれはそう

まだまだ作ったばかりなので、玄人のソースコードを見てもっと
メモリやCPU効率の良いコードになるよう頑張ります。

ソース

知見を増やしたいのでFBやマサカリ大募集中です。よければ見てやってください。
最後まで読んでいただきありがとうございました。

Discussion