This commit is contained in:
Andrey Parhomenko 2023-12-07 12:29:57 +03:00
commit e26dee007f
8 changed files with 146 additions and 0 deletions

4
.gitignore vendored Normal file
View file

@ -0,0 +1,4 @@
*.exe
exe
*.vim
test

37
cmd/test/main.go Normal file
View file

@ -0,0 +1,37 @@
package main
import (
"github.com/omnipunk/bond"
)
var root = bond.Mux().
Def(
"",
bond.ContextFunc(func(c *bond.Context){
c.W.Write([]byte("This is the index page"))
}),
).Def(
"hello",
bond.Mux().Def(
"en",
bond.ContextFunc(func(c *bond.Context){
c.W.Write([]byte("Hello, World!"))
}),
).Def(
"ru",
bond.ContextFunc(func(c *bond.Context){
c.W.Write([]byte("Привет, Мир!"))
}),
),
)
func main() {
srv := bond.Server{
Addr: ":10800",
Handler: root,
}
err := srv.ListenAndServe()
if err != nil {
panic(err)
}
}

9
errors.go Normal file
View file

@ -0,0 +1,9 @@
package bond
import (
"errors"
)
var (
DupDefErr = errors.New("duplicate route define")
)

3
go.mod Normal file
View file

@ -0,0 +1,3 @@
module github.com/omnipunk/bond
go 1.21.3

25
handler.go Normal file
View file

@ -0,0 +1,25 @@
package bond
import (
"net/http"
)
type Request = http.Request
type ResponseWriter = http.ResponseWriter
type HandlerFunc = http.HandlerFunc
type Handler = http.Handler
type Server = http.Server
type Context struct {
R *Request
W ResponseWriter
}
type ContextFunc func(*Context)
func (fn ContextFunc) ServeHTTP(w ResponseWriter, r *Request) {
fn(&Context{
R: r,
W: w,
})
}

5
readme.md Normal file
View file

@ -0,0 +1,5 @@
# bond
Golang library to easily write backend and connect
it to the frontend.

56
router.go Normal file
View file

@ -0,0 +1,56 @@
package bond
import (
"net/http"
"strings"
"fmt"
"path"
)
type Router struct {
pathMap map[string] Handler
}
func Mux() *Router {
ret := &Router{}
ret.pathMap = map[string] Handler{}
return ret
}
func (router *Router) Def(pth string, handler Handler) *Router {
_, dup := router.pathMap[pth]
if dup {
panic(DupDefErr)
}
router.pathMap[pth] = handler
return router
}
func (router *Router) ServeHTTP(w ResponseWriter, r *Request) {
pth := r.URL.Path
pth = path.Clean(pth)
pths := strings.SplitN(pth, "/", 3)
var name string
if len(pths) > 1 {
name = pths[1]
}
name, _ = strings.CutSuffix(name, "/")
prefix := "/"
if pth != "/" {
prefix = path.Clean("/" + name)
}
fmt.Printf("Path: %q\n", r.URL.Path)
fmt.Printf("%q %q %q %q\n", pth, prefix, pths, name)
handler, ok := router.pathMap[name]
if !ok {
http.NotFound(w, r)
return
}
r.URL.Path = pth
http.StripPrefix(prefix, handler).ServeHTTP(w, r)
}

7
taskfile.yml Normal file
View file

@ -0,0 +1,7 @@
version: 3
tasks:
btest:
cmds:
- go build -o ./test ./cmd/test/