Skip to content

jakecoffman/crud

Folders and files

NameName
Last commit message
Last commit date

Latest commit

f19df8f · Nov 1, 2024
Mar 29, 2024
Feb 7, 2024
Oct 30, 2023
Mar 6, 2021
Feb 25, 2021
Feb 22, 2021
Feb 7, 2024
Feb 7, 2024
Feb 7, 2024
Nov 1, 2024
Nov 1, 2024
Jul 16, 2024
Jul 16, 2024
Nov 19, 2021
Nov 19, 2021
Apr 23, 2021
Mar 8, 2021
Mar 1, 2021
Mar 10, 2021
Feb 27, 2021
Dec 3, 2021
Apr 4, 2023

Repository files navigation

crud

GoDoc Go

An OpenAPI v2 builder and validation library for building HTTP/REST APIs.

No additional dependencies besides the router you choose.

Status

Version 1.0 is stable, version 2 will support OpenAPI v3.

Why

OpenAPI is great, but up until now your options to use it are:

  1. Write YAML by hand and then make your server match your spec.
  2. Write YAML by hand and generate your server.
  3. Generate YAML from comments in your code.

None of these options seems like a great idea.

This project takes another approach: make a specification in Go code using type-safe builders where possible. The OpenAPI spec is generated from this and validation is done before your handler gets called.

This reduces boilerplate that you have to write and gives you nice documentation too!

Examples

Getting started

Check the example directory under the adapters for a simple example.

Start by getting the package go get github.com/jakecoffman/crud

Then in your main.go:

  1. Create a router with NewRouter, use an adapter from the adapters sub-package or write you own.
  2. Add routes with Add.
  3. Then call Serve.

Routes are specifications that look like this:

crud.Spec{
	Method:      "PATCH",
	Path:        "/widgets/{id}",
	PreHandlers: Auth,
	Handler:     CreateHandler,
	Description: "Adds a widget",
	Tags:        []string{"Widgets"},
	Validate: crud.Validate{
		Path: crud.Object(map[string]crud.Field{
			"id": crud.Number().Required().Description("ID of the widget"),
		}),
		Body: crud.Object(map[string]crud.Field{
			"owner": crud.String().Required().Example("Bob").Description("Widget owner's name"),
			"quantity": crud.Integer().Min(1).Default(1).Description("The amount requested")
		}),
	},
}

This will add a route /widgets/:id that responds to the PATCH method. It generates swagger and serves it at the root of the web application. It validates that the ID in the path is a number, so you don't have to. It also validates that the body is an object and has an "owner" property that is a string, again so you won't have to.

It mounts the swagger-ui at / and loads up the generated swagger.json:

screenshot

The PreHandlers run before validation, and the Handler runs after validation is successful.