11. AWS SDK for Go internal
• /service 以下は モデルベースのapi生成 によって自動生成
されたコード
• /apis/{service_name} にJSONで書かれたapiの定義があ
り、これを利用している
• ちなみにこの定義はbotoで使っているものらしい
12. go generate
Generating code - The Go Blog
• ライブラリ開発者のための機能
• ファイルのヘッダに go:generate gen などと書いておくと
go generate で gen が実行される
• gen を実行することでファイルが生成される
• ワンライナー実行のためのwrapper
13. AWS SDK for Go の Makefileより
aws-sdk-go/Makefile at master : awslabs/aws-sdk-go
default: generate
generate-protocol-test:
go generate ./internal/protocol/...
generate-integration-test:
go generate ./internal/fixtures/integration
generate-test: generate-protocol-test generate-integration-test
generate:
go generate ./aws
go generate ./service
test: generate-test
go test ./... -tags=integration
14. ライブラリのコードを生成する
aws-sdk-go/generate.go at master : awslabs/aws-sdk-go
// Package service contains automatically generated AWS clients.
package service
//go:generate go run ../internal/model/cli/gen-api/main.go -path=../service ../apis/*/*.normal.json
internal/model/api あたりを読むとどのようにコードを生成し
ているかがわかります。
15. 例: ListBuckets (apis/s3 での定義)
それぞれのapiの定義がJSONで書かれている
"ListBuckets":{
"name":"ListBuckets",
"http":{
"method":"GET",
"requestUri":"/"
},
"output":{"shape":"ListBucketsOutput"},
"documentation":"Returns a list of all buckets owned by the authenticated sender of the request.",
"documentationUrl":"http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTServiceGET.html",
"alias":"GetService"
},
https://github.com/awslabs/aws-sdk-go/blob/master/apis/
s3/2006-03-01.normal.json#L397-L407
17. auto-generated example code
• GoにはExampleがテストになる機能が標準ライブラリに付い
ている
• Testable Examples in Go - The Go Blog
• AWS SDK for GoではこのExampleテストも自動生成されてい
る
• godoc で簡単に実行例をみることができる
18. Example Test: S3 ListBuckets()の例
func ExampleS3_ListBuckets() {
svc := s3.New(nil)
var params *s3.ListBucketsInput
resp, err := svc.ListBuckets(params)
if awsErr, ok := err.(awserr.Error); ok {
// Generic AWS Error with Code, Message, and original error (if any)
fmt.Println(awsErr.Code(), awsErr.Message(), awsErr.OrigErr())
if reqErr, ok := err.(awserr.RequestFailure); ok {
// A service error occurred
fmt.Println(reqErr.Code(), reqErr.Message(), reqErr.StatusCode(), reqErr.RequestID())
}
} else {
fmt.Println(err.Error())
}
// Pretty-print the response data.
fmt.Println(awsutil.StringValue(resp))
}
aws-sdk-go/examples_test.go at master : awslabs/aws-sdk-go より
これも自動生成されている