namespace example.weather /// Provides weather forecasts. @paginated(inputToken: "nextToken", outputToken: "nextToken", pageSize: "pageSize") service Weather { version: "2006-03-01" resources: [City] operations: [GetCurrentTime] } resource City { identifiers: { cityId: CityId }, read: GetCity list: ListCities resources: [Forecast] } resource Forecast { identifiers: { cityId: CityId } read: GetForecast } // "pattern" is a trait. @pattern("^[A-Za-z0-9 ]+$") string CityId @readonly operation GetCity { input: GetCityInput output: GetCityOutput errors: [NoSuchResource] } structure GetCityInput { // "cityId" provides the identifier for the resource and // has to be marked as required. @required cityId: CityId } structure GetCityOutput { // "required" is used on output to indicate if the service // will always provide a value for the member. @required name: String @required coordinates: CityCoordinates } // This structure is nested within GetCityOutput. structure CityCoordinates { @required latitude: Float @required longitude: Float } // "error" is a trait that is used to specialize // a structure as an error. @error("client") structure NoSuchResource { @required resourceType: String } // The paginated trait indicates that the operation may // return truncated results. @readonly @paginated(items: "items") operation ListCities { input: ListCitiesInput output: ListCitiesOutput } structure ListCitiesInput { nextToken: String pageSize: Integer } structure ListCitiesOutput { nextToken: String @required items: CitySummaries } // CitySummaries is a list of CitySummary structures. list CitySummaries { member: CitySummary } // CitySummary contains a reference to a City. @references([{resource: City}]) structure CitySummary { @required cityId: CityId @required name: String } @readonly operation GetCurrentTime { output: GetCurrentTimeOutput } structure GetCurrentTimeOutput { @required time: Timestamp } @readonly operation GetForecast { input: GetForecastInput output: GetForecastOutput } // "cityId" provides the only identifier for the resource since // a Forecast doesn't have its own. structure GetForecastInput { @required cityId: CityId } structure GetForecastOutput { chanceOfRain: Float }