try typed c.Render

prototype is a success!
This commit is contained in:
iacore
2024-08-20 00:04:31 +00:00
parent aa23a9717b
commit c0bb252c06
4 changed files with 36 additions and 5 deletions
+3 -3
View File
@@ -15,11 +15,11 @@ import (
"codeberg.org/vnpower/pixivfe/v2/config"
"codeberg.org/vnpower/pixivfe/v2/pixiv_api"
"codeberg.org/vnpower/pixivfe/v2/session"
"codeberg.org/vnpower/pixivfe/v2/routes"
"codeberg.org/vnpower/pixivfe/v2/session"
"codeberg.org/vnpower/pixivfe/v2/utils"
"codeberg.org/vnpower/pixivfe/v2/utils/kmutex"
"github.com/goccy/go-json"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cache"
@@ -86,7 +86,7 @@ func main() {
// Send custom error page
c.Status(code)
err = c.Render("error", fiber.Map{"Title": "Error", "Error": err})
err = routes.Render(c, routes.Data_error{Title: "Error", Error: err})
if err != nil {
return c.Status(fiber.StatusInternalServerError).SendString(fmt.Sprintf("Internal Server Error: %s", err))
}
+30
View File
@@ -0,0 +1,30 @@
package routes
import (
"log"
"reflect"
"strings"
"github.com/gofiber/fiber/v2"
)
type Data_error struct {
Title string
Error error
}
func Render[T interface{}](c *fiber.Ctx, data T) error {
route_name, found := strings.CutPrefix(reflect.TypeFor[T]().Name(), "Data_")
if !found { log.Panicf("struct name does not start with 'Data_': %s", route_name) }
return c.Render(route_name, structToMap(data))
}
func structToMap[T interface{}](data T) map[string]interface{} {
result := map[string]interface{}{}
Type := reflect.TypeFor[T]()
for i := 0; i < Type.NumField(); i += 1 {
field := Type.Field(i)
result[field.Name] = reflect.ValueOf(data).FieldByName(field.Name).Interface()
}
return result
}
-2
View File
@@ -1,2 +0,0 @@
package routes
+3
View File
@@ -98,3 +98,6 @@ rules:
severity: INFO
pattern: |
c.Render(...)
paths:
exclude:
- "render_types.go"