🆙

Goa 更新情報 v3.8.5 / Clue v0.11.0

2022/09/07に公開

概要

Goa の更新情報メモです。

Goa v3.8.5 / Clue v0.11.0

主な変更内容

Goa v3.8.5

ミドルウエアのキーを設定可能に (#3139)

Goa で提供されるミドルウエアに RequestID というミドルウエアがあります。このミドルウエアは、context にリクエストIDを紐付けてくれるミドルウエアです。付与されるリクエストIDはデフォルトの動作としては新規に作成されますが、オプションで、アクセス時にセットされている X-Request-Id ヘッダに含まれるIDをセットするようにすることも可能でした。

この修正は、X-Request-Id ヘッダだけでなく、カスタムヘッダに指定される値を ID として context に紐付けることを可能にするものです。

Payload と Result DSL で Require がインラインで指定されたときに適切に対処する (#3140)

Require DSL を指定する位置によってうまくコードが生成できない場合があり、それが修正されました。Method の中の Payload や Result に直接 Require を書くようなデザインで問題があったようです(そんなところにかけるとは思わなかった)。

追加されていたテストコードの DSL を貼っておきます。

var ResultWithInlineValidationDSL = func() {
	var RT = ResultType("application/vnd.result.inline.validation", func() {
		Attributes(func() {
			Attribute("a", String)
			Attribute("b", Int)
		})
	})
	Service("ResultWithInlineValidation", func() {
		Method("A", func() {
			Result(RT)
		})
		Method("B", func() {
			Result(RT, func() {
				Required("a")     // ← 訳注: こんなところに書くなんて通ですね・・・
			})
		})
	})
}

OpenAPI で forced types な型を強制的に生成するようにする (#3142)

OneOf 作られる Union 属性は JSON エンコーディングされた文字列で表現されるので、仕様が OpenAPI spec に書き出されていませんでした。type:generate:force を指定することでこれを OpenAPI spec に出力する事が出来るようになりました(type:generate:force は前からあるタグです)。

使ったことないから分からんが、たぶんこういうこと?

var PetOwner = Type("PetOwner", func() {
    Name("name", String)
    OneOf("pet", "Owner's pet", func() {
        Attribute("cat", Cat, "Cats are cool")
        Attribute("dog", Dog, "Dogs are cool too")
    })
    Meta("type:generate:force")
})

Clue v0.11.0

HTTP や gRPC のクライアントをラップしてログする log.Client() が追加された

HTTP や gRPC の任意クライアントをラップして、ロギングするミドルウエアのようなものが追加されました。

たとえば HTTP の log.Client() は下記のように実装されています。

// Client returns a HTTP client that wraps the given doer and log requests and
// responses using the clue logger stored in the request context.
func Client(doer Doer, opts ...HTTPClientLogOption) Doer {
	options := &httpClientOptions{
		iserr: func(status int) bool { return status >= 400 },
	}
	for _, o := range opts {
		o(options)
	}
	return &client{Doer: doer, options: options}
}

引数に取る Doer はインターフェースになっていて、要するに HTTP クライアントです。これをログでラップして、実行時のメソッドや URL、レスポンスステータス、かかった時間などをログすることが出来るようになります(たぶん)。

Doer interface {
	Do(*http.Request) (*http.Response, error)
}

使い方のサンプルは ここ とか ここ とのこと。

最近ちょこちょこ機能が追加されたりバグ修正されたりしていますね。

Happy hacking!

Discussion