README ¶
Iris Path Expression Language (_future)
Ideas & Goals
- Optional.
- No Breaking Changes.
- No performance cost if not used.
- Can convert a path for the existing routers, if no router is being used, then it will use its own, new, router.
- 4+1 basic parameter types:
string
,int
,alphabetical
,file
,path
(file with any number of slashes), based on regexp. - Each type has unlimited functions of its own, they should be able to be overriden.
- Give devs the ability to parse their function's arguments before use them and return a func which is the validator.
- Function will be a generic type(
interface{}
) in order to devs be able to use any type without boilerplate code for conversions, can be done using reflection and reflect.Call, on .Boot time to parse the function automatically, and keep the returning validator function (already tested and worked). - The
string
will be the default if dev use functions to the named path parameter but missing a type. - If a type doesnt't contains a function of its own, then it will use the
string
's, sostring
will contain global-use functions too.
Preview
/api/users/{id:int min(1)}/posts
minValidator := func(min int) func(string) bool {
return func(paramValue string) bool {
paramValueInt, err := strconv.Atoi(paramValue)
if err != nil {
return false
}
if paramValueInt < min {
return false
}
return true
}
}
app := iris.New()
app.Int.Set("min", minValidator)
/api/{version:string len(2) isVersion()}
isVersionStrValidator := func() func(string) bool {
versions := []string{"v1","v2"}
return func(paramValue string) bool {
for _, s := range versions {
if s == paramValue {
return true
}
}
return false
}
}
lenStrValidator := func(i int) func(string) bool {
if i <= 0 {
i = 1
}
return func(paramValue string) bool {
return len(paramValue) != i
}
}
app := iris.New()
app.String.Set("isVersion", isVersionStrValidator)
app.String.Set("len", lenStrValidator)
/uploads/{fullpath:path contains(.) else 403}
[...]
[...]
/api/validate/year/{year:int range(1970,2017) else 500}
[...]
[...]
Resources
- Lexical analysis necessary
- Top-down parsing necessary
- Recursive descent parser basic, continue to the rest after
- Handwritten Parsers & Lexers in Go very good
- Creating a VM / Compiler Episode 1: Bytecode VM nice to watch
- So you want to write an interpreter? watch it, continue to the rest later on
- Writing a Lexer and Parser in Go - Part 1 a different approach using the strategy pattern, not for production use in my opinion
- Writing a Lexer and Parser in Go - Part 2
- Writing a Lexer and Parser in Go - Part 3
- Writing An Interpreter In Go I recommend this book: suitable for both experienced and novice developers
Documentation ¶
There is no documentation for this package.
Click to show internal directories.
Click to hide internal directories.