Files
gin-contrib/static/embedfolder.go
T
s.solodyagin af882e46c3 fix: static
revert

fix: static

fix: static

fix: static
2024-07-25 08:29:58 +03:00

72 lines
1.3 KiB
Go

package static
import (
"embed"
"io/fs"
"net/http"
"strings"
"git.company.lan/gopkg/gin"
)
type embedFileSystem struct {
http.FileSystem
override []Override
}
func (e embedFileSystem) Exists(prefix string, file string) bool {
name := strings.TrimPrefix(file, prefix)
if name == "" {
name = "/"
}
f, err := e.Open(name)
if err != nil {
return false
}
defer f.Close()
return true
}
func (e embedFileSystem) Override(c *gin.Context) bool {
if len(e.override) > 0 {
fn := e.override[0]
return fn(c)
}
return false
}
func EmbedFolder(fsEmbed embed.FS, reqPath string, override ...Override) (ServeFileSystem, error) {
targetPath := strings.TrimSpace(reqPath)
if targetPath == "" {
return embedFileSystem{
FileSystem: http.FS(fsEmbed),
override: override,
}, nil
}
fsys, _ := fs.Sub(fsEmbed, targetPath)
_, err := fsEmbed.Open(targetPath)
if err != nil {
return nil, err
}
return embedFileSystem{
FileSystem: http.FS(fsys),
override: override,
}, nil
}
func ServeEmbed(reqPath string, fsEmbed embed.FS) gin.HandlerFunc {
embedFS, err := EmbedFolder(fsEmbed, reqPath)
if err != nil {
return func(c *gin.Context) {
c.JSON(http.StatusInternalServerError, gin.H{
"message": "initialization of embed folder failed",
"error": err.Error(),
})
}
}
return gin.WrapH(http.FileServer(embedFS))
}