API Specificity with Overlays and Enums
To start with, let’s use this library book example snippet from an OpenAPI file – this is just the Components section:
components:
schemas:
Book:
type: object
properties:
isbn:
type: string
description: ISBN publication identifier
format: isbn
example: "9781250236210"
title:
type: string
description: Book title
example: "A Psalm for the Wild-Built"
author:
type: string
description: Author's name
example: "Becky Chambers"
genre:
type: string
description: Genre of the book
example: "Solarpunk"
That genre
field at the end of the list is just a string – but in my library, I’m going to only offer a very specific set of genres, so I want to limit the values that can be used there. To that I’ll use an OpenAPI Overlay.
Here’s the Overlay:
overlay: "1.0.0"
x-speakeasy-jsonpath: rfc9535
info:
title: "Set the genres list"
version: "1.0.1"
actions:
- target: $["components"]["schemas"]["Book"]["properties"]["genre"]
update:
enum:
- Science Fiction
- Fantasy
- Speculative
- Solarpunk
- Philosophy
There are a few different tools that you can use to apply an Overlay – I’ve been using Speakeasy CLI a lot lately, mostly because I’m working with other OpenAPI tools and then using this tool’s compare
command to get an OpenAPI diff in Overlay format that I can reapply elsewhere.
Using Speakeasy CLI, the command to apply the overlay (let’s say the file is overlay.yaml
) to the OpenAPI description (imaginatively, mine is called library.openapi.yaml
) is as follows:
speakeasy overlay apply --overlay=overlay.yaml --schema=library.openapi.yaml --out updated.openapi.yaml
The overlay updates the Book schema so that now the components section looks like this:
omponents:
schemas:
Book:
type: object
properties:
isbn:
type: string
example: "9781250236210"
description: ISBN publication identifier
format: isbn
title:
type: string
description: Book title
example: "A Psalm for the Wild-Built"
author:
type: string
description: Author's name
example: "Becky Chambers"
genre:
type: string
description: Genre of the book
example: "Solarpunk"
enum:
- Science Fiction
- Fantasy
- Speculative
- Solarpunk
- Philosophical
Make your API implementations your own
Adding repeatable OpenAPI description updates with Overlays is a good way to get from a generic or rather vague API description to something that you can implement efficiently in your own projects. Especially with published standards that might be used in many different settings, it can be particularly valuable to adapt to your own needs.
In this example, we showed adding enums which is a great way to give your SDKs and validators clearer instructions on the values that should be expected. Don’t neglect the other fields, such as updating descriptions or adding meaningful examples that will help those implementing the API (human or machine) to have the context they need to be successful.