diff --git a/main.go b/main.go index 746c9bd..867cc55 100644 --- a/main.go +++ b/main.go @@ -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)) } diff --git a/routes/render_types.go b/routes/render_types.go new file mode 100644 index 0000000..56f388f --- /dev/null +++ b/routes/render_types.go @@ -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 +} diff --git a/routes/templateTypes.go b/routes/templateTypes.go deleted file mode 100644 index ff9cd63..0000000 --- a/routes/templateTypes.go +++ /dev/null @@ -1,2 +0,0 @@ -package routes - diff --git a/semgrep.yml b/semgrep.yml index 12e3854..2ecc51c 100644 --- a/semgrep.yml +++ b/semgrep.yml @@ -98,3 +98,6 @@ rules: severity: INFO pattern: | c.Render(...) + paths: + exclude: + - "render_types.go" \ No newline at end of file