working commit

This commit is contained in:
2026-02-06 15:17:16 +02:00
parent 97c58bb283
commit d7e57c5f42
4 changed files with 461 additions and 0 deletions
+51
View File
@@ -0,0 +1,51 @@
package router
import (
"reflect"
"strconv"
)
// Don't ask me how it works. ;)
func bindObj(obj interface{}, kvmap map[string]string, sTag string) error {
var err error
vElem := reflect.ValueOf(obj).Elem()
sElem := reflect.TypeOf(obj).Elem()
for i := 0; i < vElem.NumField(); i++ {
vField := vElem.Field(i)
tag := sElem.Field(i).Tag.Get(sTag)
if tag != "" {
sVal, exists := kvmap[tag]
if exists {
switch vField.Kind() {
case reflect.String:
vField.SetString(sVal)
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
iVal, err := strconv.ParseInt(sVal, 10, 64)
if err != nil {
return err
}
vField.SetInt(iVal)
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
iVal, err := strconv.ParseUint(sVal, 10, 64)
if err != nil {
return err
}
vField.SetUint(iVal)
case reflect.Bool:
bVal, err := strconv.ParseBool(sVal)
if err != nil {
return err
}
vField.SetBool(bVal)
case reflect.Float32, reflect.Float64:
fVal, err := strconv.ParseFloat(sVal, 64)
if err != nil {
return err
}
vField.SetFloat(fVal)
}
}
}
}
return err
}
+33
View File
@@ -1,8 +1,10 @@
package router
import (
"bytes"
"context"
"encoding/json"
"io"
"net/http"
)
@@ -47,6 +49,37 @@ func (rctx *Context) GetContext() context.Context {
return rctx.Request.Context()
}
// Binding
const emptyJSON = "{}"
func (ctx *Context) BindJSON(obj any) error {
buffer := bytes.NewBuffer(nil)
_, err := io.Copy(buffer, ctx.Request.Body)
if err != nil {
return err
}
reqBody := buffer.Bytes()
if len(reqBody) == 0 {
reqBody = []byte(emptyJSON)
}
err = json.Unmarshal(reqBody, obj)
if err != nil {
return err
}
return err
}
func (ctx *Context) BindQuery(obj any) error {
qMap := make(map[string]string)
for key, val := range ctx.Request.URL.Query() {
if len(val) == 1 {
qMap[key] = val[0]
}
}
return bindObj(obj, qMap, "param")
}
// Response
func (rctx *Context) SetHeader(key, value string) {
rctx.Writer.Header().Set(key, value)
+30
View File
@@ -1,3 +1,33 @@
/*
* Copyright 2026 Oleg Borodin <onborodin@gmail.com>
*
* This work is published and licensed under a Creative Commons
* Attribution-NonCommercial-NoDerivatives 4.0 International License.
*
* Distribution of this work is permitted, but commercial use and
* modifications are strictly prohibited.
*/
/*
* Это произведение распространяется под лицензией Creative Commons
* Attribution-NonCommercial-NoDerivatives 4.0 International License
*
* Разрешается распространение, но запрещаются коммерческое использование
* и изменения данного произведения.
*
* Вы можете свободно делиться, то есть копировать, распространять и передавать
* другим лицам данное произведение при обязательном соблюдении следующих условий:
*
* Атрибуция: Вы должны атрибутировать произведение (указывать автора и источник)
* в порядке, предусмотренном автором или лицензиаром.
*
* Некоммерческое использование: Вы не можете использовать это произведение
* в коммерческих целях.
*
* Без производных произведений: Вы не можете изменять, преобразовывать или брать
* за основу это произведение.
*/
package server
import (