# Smithy Go [![Go Build Status](https://github.com/aws/smithy-go/actions/workflows/go.yml/badge.svg?branch=main)](https://github.com/aws/smithy-go/actions/workflows/go.yml) [![Codegen Build Status](https://github.com/aws/smithy-go/actions/workflows/codegen.yml/badge.svg?branch=main)](https://github.com/aws/smithy-go/actions/workflows/codegen.yml) [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE) [Smithy](https://smithy.io/) code generators for [Go](https://go.dev/), and the runtime package the generated code depends on. > [!WARNING] > All interfaces in this repository are subject to change. The client code > generator in particular powers > [aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2), but arbitrary client > generation is in an early stage of development: > * Generated clients are missing certain features that were originally > implemented SDK-side (e.g. retries) > * There may be bugs > * The public APIs of generated clients may be unstable > > If you are interested in using the client code generators, we encourage you > to experiment and share any feedback with us in an issue. --- This repository contains two major components: 1. **Codegen** ([`codegen/`](codegen)): A Java/Gradle-based Smithy build plugin that generates Go client, server, and shape code from Smithy models. 2. **Runtime** (this module, `github.com/aws/smithy-go`): The Go packages that code generated by the plugins above depends on. > [!NOTE] > This repository does not contain any generated clients, such as for S3 or > other AWS services. Rather, these are the tools that facilitate generating > those clients (and non-AWS Smithy clients) from a Smithy model. ## Getting started If this is your first time using Smithy, follow the [Smithy Quickstart guide](https://smithy.io/2.0/quickstart.html) to learn the basics and create a simple Smithy model. The smithy-go runtime requires a minimum version of **Go 1.24**. ### Codegen To generate a Go client from a Smithy model, apply the `go-codegen` plugin in your `smithy-build.json`: ```json { "version": "1.0", "sources": [ "models" ], "maven": { "dependencies": [ "software.amazon.smithy.go:smithy-go-codegen:[0.1.0,2.0)" ] }, "plugins": { "go-codegen": { "service": "example.weather#Weather", "module": "github.com/example/weather", "generateGoMod": true, "goDirective": "1.24" } } } ``` This repository implements the following Smithy build plugins: | ID | GAV prefix | Description | |----|------------|-------------| | `go-codegen` | `software.amazon.smithy.go:smithy-go-codegen` | Go client code generation for Smithy models. | | `go-server-codegen` | `software.amazon.smithy.go:smithy-go-codegen` | Go server code generation for Smithy models (work-in-progress, undocumented). | | `go-shape-codegen` | `software.amazon.smithy.go:smithy-go-codegen` | Go shape code generation (types only) for Smithy models (work-in-progress, undocumented). | #### `go-codegen` settings [`GoSettings`](codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/GoSettings.java) contains all of the settings enabled from `smithy-build.json`. The up-to-date list of top-level properties enabled for `go-codegen` can be found in `GoSettings::from()`. | Setting | Type | Required | Description | |-----------------|---------|----------|-------------------------------------------------------------------------------------------------------------------------------| | `service` | string | yes | The Shape ID of the service for which to generate the client. | | `module` | string | yes | Name of the module in `generated.json` (and `go.mod` if `generateGoMod` is enabled) and `doc.go`. | | `generateGoMod` | boolean | | Whether to generate a default `go.mod` file. The default value is `false`. | | `goDirective` | string | | [Go directive](https://go.dev/ref/mod#go-mod-file-go) of the module. The default value is the minimum supported Go version. | #### Supported protocols The protocol a generated client uses is configured by the `Protocol` field on the client's `Options`. The SDK configures a default based on the protocol traits applied to the modeled service. Each protocol is implemented as its own package under [`transport/http/protocol`](transport/http/protocol). Serialization for these protocols is handled by internal codecs under `protocol/internal` (e.g. `protocol/internal/json`, `protocol/internal/cbor`, `protocol/internal/xml`); these largely supersede the top-level [`encoding/`](encoding) packages of the same name; see [Encoding](#encoding) below. | Protocol | Package | Notes | |----------|---------|-------| | [`smithy.protocols#rpcv2Cbor`](https://smithy.io/2.0/additional-specs/protocols/smithy-rpc-v2.html) | [`protocol/rpcv2`](transport/http/protocol/rpcv2) | | | [`aws.protocols#restJson1`](https://smithy.io/2.0/aws/protocols/aws-restjson1-protocol.html) | [`protocol/restjson1`](transport/http/protocol/restjson1) | | | [`aws.protocols#restXml`](https://smithy.io/2.0/aws/protocols/aws-restxml-protocol.html) | [`protocol/restxml`](transport/http/protocol/restxml) | | | [`aws.protocols#awsJson1_0`](https://smithy.io/2.0/aws/protocols/aws-json-1_0-protocol.html) | [`protocol/awsjson`](transport/http/protocol/awsjson) | `awsjson.New10` | | [`aws.protocols#awsJson1_1`](https://smithy.io/2.0/aws/protocols/aws-json-1_1-protocol.html) | [`protocol/awsjson`](transport/http/protocol/awsjson) | `awsjson.New11` | | [`aws.protocols#awsQuery`](https://smithy.io/2.0/aws/protocols/aws-query-protocol.html) | [`protocol/awsquery`](transport/http/protocol/awsquery) | | | [`aws.protocols#ec2Query`](https://smithy.io/2.0/aws/protocols/aws-ec2-query-protocol.html) | [`protocol/ec2query`](transport/http/protocol/ec2query) | | These packages are client-only; smithy-go does not currently implement server-side protocol support. Building and testing the codegen plugins is done via Gradle from the `codegen/` directory: ```bash # Build and test codegen cd codegen && ./gradlew build # Publish to local Maven for downstream use cd codegen && ./gradlew publishToMavenLocal ``` See [`codegen/README.md`](codegen/README.md) for local setup instructions. ## Runtime packages All generated clients depend on this module (`github.com/aws/smithy-go`) at runtime. It also includes a few standalone submodules published separately. ### Core - [`middleware`](middleware): The middleware stack that drives the operation pipeline. - [`transport/http`](transport/http): HTTP request/response types and middleware. - [`auth`](auth): Auth identity and scheme interfaces. - [`auth/bearer`](auth/bearer): Bearer token auth. - [`endpoints`](endpoints): Endpoint resolution types. - [`context`](context): Context helpers. - [`logging`](logging): Logging interfaces. - [`tracing`](tracing): Tracing interfaces. - [`metrics`](metrics): Metrics interfaces. ### Encoding Wire format encoders/decoders under [`encoding/`](encoding). > [!NOTE] > Most of these packages are effectively legacy. The protocol > implementations under [`transport/http/protocol`](transport/http/protocol) > (used by current client codegen) have their own internal codecs under > `protocol/internal/*` and generally do not build on these packages. > The `encoding/json`, `encoding/xml`, and `encoding/cbor` packages otherwise > remain in use by [`document/json`](document/json)/[`document/cbor`](document/cbor) > and [`eventstream`](eventstream), and by existing generated SDK code that > predates the newer protocol implementations. - [`encoding/json`](encoding/json): JSON encoding/decoding. - [`encoding/xml`](encoding/xml): XML encoding/decoding. - [`encoding/cbor`](encoding/cbor): CBOR encoding/decoding (used by `rpcv2Cbor`). - [`encoding/httpbinding`](encoding/httpbinding): HTTP binding serde helpers. ### Document - [`document`](document): Smithy document type abstraction. - [`document/json`](document/json): JSON document codec. ### Utilities - [`container`](container): Generic container types. - [`io`](io): I/O helpers. - [`ptr`](ptr): Pointer-to/from-value helpers. - [`time`](time): Smithy timestamp format helpers. - [`rand`](rand): UUID/randomness helpers. - [`testing`](testing): Test assertion helpers for generated protocol tests. ### Standalone modules These are published as separate Go modules, each with its own `go.mod`. - [`aws-http-auth`](aws-http-auth): AWS SigV4/SigV4A HTTP signing. - [`tracing/smithyoteltracing`](tracing/smithyoteltracing): OpenTelemetry tracing adapter. - [`metrics/smithyotelmetrics`](metrics/smithyotelmetrics): OpenTelemetry metrics adapter. ## Development See [CONTRIBUTING](CONTRIBUTING.md) for more information on contributing to this project, including the changelog process for runtime changes. ## License This project is licensed under the Apache-2.0 License.