Documentation
¶
Overview ¶
Example ¶
package main
import (
"context"
"net/http"
"time"
)
func main() {
up := newUserProvider()
http.HandleFunc(HandleEntities("/users/", up))
err := http.ListenAndServe(":8080", nil)
if err != nil {
panic(err)
}
}
type user struct {
Name string `json:"name" xml:"name"`
EmailAddress string `json:"email_address" xml:"email_address"`
BirthDate time.Time `json:"birth_date" xml:"birth_date"`
}
func (u user) IDString() string {
return u.Name
}
func (u *user) IDFromString(s string) error {
u.Name = s
return nil
}
type UserProvider struct {
mem map[string]user
}
func newUserProvider() *UserProvider {
return &UserProvider{
mem: map[string]user{},
}
}
func (up *UserProvider) Create(ctx context.Context, u *user) (*user, error) {
up.mem[u.Name] = *u
return u, nil
}
func (up UserProvider) Get(ctx context.Context, entity Entity) (*user, error) {
u, ok := up.mem[entity.IDString()]
if !ok {
return &user{}, ErrNotFound
}
return &u, nil
}
func (up *UserProvider) Delete(ctx context.Context, entity Entity) error {
_, ok := up.mem[entity.IDString()]
if !ok {
return ErrNotFound
}
delete(up.mem, entity.IDString())
return nil
}
func (up *UserProvider) Update(ctx context.Context, u *user) error {
_, ok := up.mem[u.Name]
if !ok {
return ErrNotFound
}
up.mem[u.Name] = *u
return nil
}
func (up *UserProvider) ListAll(ctx context.Context) ([]*user, error) {
var users []*user
for _, u := range up.mem {
// we copy to avoid referring the same pointer that would get updated
u := u
users = append(users, &u)
}
return users, nil
}
Index ¶
- Constants
- Variables
- func Handle[Input, Output any](method string, f InputOutputFunc[Input, Output]) http.HandlerFunc
- func HandleEntities[Ent Entity, EP EntityProvider[Ent]](urlPath string, ep EP, middlewares ...Middleware) (path string, handler http.HandlerFunc)
- type Entity
- type EntityCreater
- type EntityDeleter
- type EntityGetter
- type EntityLister
- type EntityProvider
- type EntityUpdater
- type ErrorCode
- type InputOutputFunc
- type Middleware
Examples ¶
Constants ¶
const NewEntityID = "rip-new-entity-id"
Variables ¶
var ( ErrNotFound = ripError{ Code: ErrorCodeNotFound, Status: http.StatusNotFound, Message: "entity not found", } )
Functions ¶
func Handle ¶
func Handle[ Input, Output any, ]( method string, f InputOutputFunc[Input, Output], ) http.HandlerFunc
Handle is a generic HTTP handler that maps an HTTP method to a RequestResponseFunc f.
func HandleEntities ¶ added in v0.1.4
func HandleEntities[ Ent Entity, EP EntityProvider[Ent], ]( urlPath string, ep EP, middlewares ...Middleware, ) (path string, handler http.HandlerFunc)
HandleEntities associates an urlPath with an entity provider, and handles all HTTP requests in a RESTful way:
POST /entities/ : creates the entity GET /entities/:id : get the entity PUT /entities/:id : updates the entity (needs to pass the full entity data) DELETE /entities/:id : deletes the entity GET /entities/ : lists the entities
Types ¶
type Entity ¶ added in v0.1.4
type Entity interface {
// IDString returns an ID in form of a string.
IDString() string
// IDFromString serialize an ID from s.
IDFromString(s string) error
}
Entity is a resource that can be identified by an string. It comes from the concept of entity in Domain Driven Design.
type EntityCreater ¶ added in v0.1.4
EntityCreater creates a entity that can be identified.
type EntityDeleter ¶ added in v0.1.4
EntityDeleter deletes a entity with its id.
type EntityGetter ¶ added in v0.1.4
EntityGetter gets a entity with its id.
type EntityLister ¶ added in v0.1.4
EntityLister lists a group of entities.
type EntityProvider ¶ added in v0.1.4
type EntityProvider[Ent Entity] interface { EntityCreater[Ent] EntityGetter[Ent] EntityUpdater[Ent] EntityDeleter[Ent] EntityLister[Ent] }
EntityProvider provides identifiable entities.
type EntityUpdater ¶ added in v0.1.4
EntityUpdater updates an identifiable entity.
type ErrorCode ¶
type ErrorCode int
ErrorCode maps errors from the ResourceProvider implementation to HTTP status code.
const ( // ErrorCodeNotFound happens when a resource with an id is not found. ErrorCodeNotFound ErrorCode = http.StatusNotFound // ErrorCodeBadQArg happens when a user gives a wrongly formatted header `; q=X.Y` argument. ErrorCodeBadQArg ErrorCode = 499 )
type InputOutputFunc ¶ added in v0.1.4
type InputOutputFunc[ Input, Output any, ] func(ctx context.Context, input Input) (output Output, err error)
InputOutputFunc is a function that takes a ctx and an input, and it can return an output or an err.
type Middleware ¶ added in v0.1.4
type Middleware func(http.HandlerFunc) http.HandlerFunc
Middleware is an HTTP Middleware that you can add to your handler to handle specific actions like logging, authentication, authorization, metrics, ….