mirror of
https://github.com/kataras/iris.git
synced 2026-01-23 11:56:00 +00:00
minor improvements
This commit is contained in:
178
_proposals/route_builder.md
Normal file
178
_proposals/route_builder.md
Normal file
@@ -0,0 +1,178 @@
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/kataras/iris/v12/macro"
|
||||
)
|
||||
|
||||
func main() {
|
||||
path := NewRouteBuilder().
|
||||
Path("/user").
|
||||
String("name", "prefix(ma)", "suffix(kis)").
|
||||
Int("age").
|
||||
Path("/friends").
|
||||
Wildcard("rest").
|
||||
Build()
|
||||
|
||||
fmt.Println(path)
|
||||
}
|
||||
|
||||
type RouteBuilder struct {
|
||||
path string
|
||||
}
|
||||
|
||||
func NewRouteBuilder() *RouteBuilder {
|
||||
return &RouteBuilder{
|
||||
path: "/",
|
||||
}
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Path(path string) *RouteBuilder {
|
||||
if path[0] != '/' {
|
||||
path = "/" + path
|
||||
}
|
||||
|
||||
r.path = strings.TrimSuffix(r.path, "/") + path
|
||||
return r
|
||||
}
|
||||
|
||||
type StaticPathBuilder interface {
|
||||
Path(path string) *RouteBuilder
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Param(param ParamBuilder) *RouteBuilder { // StaticPathBuilder {
|
||||
path := "" // keep it here, a single call to r.Path must be done.
|
||||
if len(r.path) == 0 || r.path[len(r.path)-1] != '/' {
|
||||
path += "/" // if for some reason no prior Path("/") was called for delimeter between path parameter.
|
||||
}
|
||||
|
||||
path += fmt.Sprintf("{%s:%s", param.GetName(), param.GetParamType().Indent())
|
||||
if funcs := param.GetFuncs(); len(funcs) > 0 {
|
||||
path += fmt.Sprintf(" %s", strings.Join(funcs, " "))
|
||||
}
|
||||
path += "}"
|
||||
|
||||
return r.Path(path)
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) String(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.String, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Int(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.Int, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Int8(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.Int8, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Int16(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.Int16, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Int32(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.Int32, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Int64(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.Int64, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Uint(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.Uint, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Uint8(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.Uint8, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Uint16(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.Uint16, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Uint32(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.Uint32, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Uint64(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.Uint64, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Bool(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.Bool, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Alphabetical(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.Alphabetical, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) File(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.File, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Wildcard(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.Path, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) UUID(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.UUID, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Mail(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.Mail, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Email(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.Email, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Date(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.Date, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Weekday(name string, funcs ...string) *RouteBuilder {
|
||||
return r.Param(Param(macro.Weekday, name, funcs...))
|
||||
}
|
||||
|
||||
func (r *RouteBuilder) Build() string {
|
||||
return r.path
|
||||
}
|
||||
|
||||
type ParamBuilder interface {
|
||||
GetName() string
|
||||
GetFuncs() []string
|
||||
GetParamType() *macro.Macro
|
||||
}
|
||||
|
||||
type pathParam struct {
|
||||
Name string
|
||||
Funcs []string
|
||||
ParamType *macro.Macro
|
||||
}
|
||||
|
||||
var _ ParamBuilder = (*pathParam)(nil)
|
||||
|
||||
func Param(paramType *macro.Macro, name string, funcs ...string) ParamBuilder {
|
||||
return &pathParam{
|
||||
Name: name,
|
||||
ParamType: paramType,
|
||||
Funcs: funcs,
|
||||
}
|
||||
}
|
||||
|
||||
func (p *pathParam) GetName() string {
|
||||
return p.Name
|
||||
}
|
||||
|
||||
func (p *pathParam) GetParamType() *macro.Macro {
|
||||
return p.ParamType
|
||||
}
|
||||
|
||||
func (p *pathParam) GetFuncs() []string {
|
||||
return p.Funcs
|
||||
}
|
||||
```
|
||||
95
_proposals/xerrors_party.md
Normal file
95
_proposals/xerrors_party.md
Normal file
@@ -0,0 +1,95 @@
|
||||
```go
|
||||
app.PartyConfigure("/api", errors.NewParty[CreateRequest, CreateResponse, ListFilter]().
|
||||
Create(service.Create).
|
||||
Update(service.Update).
|
||||
Delete(service.DeleteWithFeedback).
|
||||
List(service.ListPaginated).
|
||||
Get(service.GetByID).Validation(validateCreateRequest))
|
||||
```
|
||||
|
||||
```go
|
||||
type Party[T, R, F any] struct {
|
||||
validators []ContextRequestFunc[T]
|
||||
filterValidators []ContextRequestFunc[F]
|
||||
filterIntercepters []ContextResponseFunc[F, R]
|
||||
intercepters []ContextResponseFunc[T, R]
|
||||
|
||||
serviceCreateFunc func(stdContext.Context, T) (R, error)
|
||||
serviceUpdateFunc func(stdContext.Context, T) (bool, error)
|
||||
serviceDeleteFunc func(stdContext.Context, string) (bool, error)
|
||||
serviceListFunc func(stdContext.Context, pagination.ListOptions, F /* filter options */) ([]R, int, error)
|
||||
serviceGetFunc func(stdContext.Context, string) (R, error)
|
||||
}
|
||||
|
||||
func (p *Party[T, R, F]) Configure(r router.Party) {
|
||||
if p.serviceCreateFunc != nil {
|
||||
r.Post("/", Validation(p.validators...), Intercept(p.intercepters...), CreateHandler(p.serviceCreateFunc))
|
||||
}
|
||||
|
||||
if p.serviceUpdateFunc != nil {
|
||||
r.Put("/{id:string}", Validation(p.validators...), Intercept(p.intercepters...), NoContentOrNotModifiedHandler(p.serviceUpdateFunc))
|
||||
}
|
||||
|
||||
if p.serviceListFunc != nil {
|
||||
r.Post("/list", Validation(p.filterValidators...), Intercept(p.filterIntercepters...), ListHandler(p.serviceListFunc))
|
||||
}
|
||||
|
||||
if p.serviceDeleteFunc != nil {
|
||||
r.Delete("/{id:string}", NoContentOrNotModifiedHandler(p.serviceDeleteFunc, PathParam[string]("id")))
|
||||
}
|
||||
|
||||
if p.serviceGetFunc != nil {
|
||||
r.Get("/{id:string}", Handler(p.serviceGetFunc, PathParam[string]("id")))
|
||||
}
|
||||
}
|
||||
|
||||
func NewParty[T, R, F any]() *Party[T, R, F] {
|
||||
return &Party[T, R, F]{}
|
||||
}
|
||||
|
||||
func (p *Party[T, R, F]) Validation(validators ...ContextRequestFunc[T]) *Party[T, R, F] {
|
||||
p.validators = append(p.validators, validators...)
|
||||
return p
|
||||
}
|
||||
|
||||
func (p *Party[T, R, F]) FilterValidation(filterValidators ...ContextRequestFunc[F]) *Party[T, R, F] {
|
||||
p.filterValidators = append(p.filterValidators, filterValidators...)
|
||||
return p
|
||||
}
|
||||
|
||||
func (p *Party[T, R, F]) Intercept(intercepters ...ContextResponseFunc[T, R]) *Party[T, R, F] {
|
||||
p.intercepters = append(p.intercepters, intercepters...)
|
||||
return p
|
||||
}
|
||||
|
||||
func (p *Party[T, R, F]) FilterIntercept(filterIntercepters ...ContextResponseFunc[F, R]) *Party[T, R, F] {
|
||||
p.filterIntercepters = append(p.filterIntercepters, filterIntercepters...)
|
||||
return p
|
||||
}
|
||||
|
||||
func (p *Party[T, R, F]) Create(fn func(stdContext.Context, T) (R, error)) *Party[T, R, F] {
|
||||
p.serviceCreateFunc = fn
|
||||
return p
|
||||
}
|
||||
|
||||
func (p *Party[T, R, F]) Update(fn func(stdContext.Context, T) (bool, error)) *Party[T, R, F] {
|
||||
p.serviceUpdateFunc = fn
|
||||
return p
|
||||
}
|
||||
|
||||
func (p *Party[T, R, F]) Delete(fn func(stdContext.Context, string) (bool, error)) *Party[T, R, F] {
|
||||
p.serviceDeleteFunc = fn
|
||||
return p
|
||||
}
|
||||
|
||||
func (p *Party[T, R, F]) List(fn func(stdContext.Context, pagination.ListOptions, F /* filter options */) ([]R, int, error)) *Party[T, R, F] {
|
||||
p.serviceListFunc = fn
|
||||
return p
|
||||
}
|
||||
|
||||
func (p *Party[T, R, F]) Get(fn func(stdContext.Context, string) (R, error)) *Party[T, R, F] {
|
||||
p.serviceGetFunc = fn
|
||||
return p
|
||||
}
|
||||
|
||||
```
|
||||
Reference in New Issue
Block a user