Embed static and templates folder when compiling, RenderTemplate now renders and serves from the embedded filesystem
This commit is contained in:
		@@ -3,10 +3,12 @@ package app
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"GoWeb/config"
 | 
						"GoWeb/config"
 | 
				
			||||||
	"database/sql"
 | 
						"database/sql"
 | 
				
			||||||
 | 
						"embed"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// App contains and supplies available configurations and connections
 | 
					// App contains and supplies available configurations and connections
 | 
				
			||||||
type App struct {
 | 
					type App struct {
 | 
				
			||||||
	Config config.Configuration
 | 
						Config config.Configuration // Configuration file
 | 
				
			||||||
	Db     *sql.DB
 | 
						Db     *sql.DB              // Database connection
 | 
				
			||||||
 | 
						Res    *embed.FS            // Resources from the embedded filesystem
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										7
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								main.go
									
									
									
									
									
								
							@@ -5,12 +5,16 @@ import (
 | 
				
			|||||||
	"GoWeb/config"
 | 
						"GoWeb/config"
 | 
				
			||||||
	"GoWeb/database"
 | 
						"GoWeb/database"
 | 
				
			||||||
	"GoWeb/routes"
 | 
						"GoWeb/routes"
 | 
				
			||||||
 | 
						"embed"
 | 
				
			||||||
	"log"
 | 
						"log"
 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:embed templates static
 | 
				
			||||||
 | 
					var res embed.FS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main() {
 | 
					func main() {
 | 
				
			||||||
	// Create instance of App
 | 
						// Create instance of App
 | 
				
			||||||
	appLoaded := app.App{}
 | 
						appLoaded := app.App{}
 | 
				
			||||||
@@ -18,6 +22,9 @@ func main() {
 | 
				
			|||||||
	// Load config file to application
 | 
						// Load config file to application
 | 
				
			||||||
	appLoaded.Config = config.LoadConfig()
 | 
						appLoaded.Config = config.LoadConfig()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Load templates
 | 
				
			||||||
 | 
						appLoaded.Res = &res
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Create logs directory if it doesn't exist
 | 
						// Create logs directory if it doesn't exist
 | 
				
			||||||
	if _, err := os.Stat("logs"); os.IsNotExist(err) {
 | 
						if _, err := os.Stat("logs"); os.IsNotExist(err) {
 | 
				
			||||||
		err := os.Mkdir("logs", 0755)
 | 
							err := os.Mkdir("logs", 0755)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,11 +7,39 @@ import (
 | 
				
			|||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RenderTemplate renders and serves a template from the embedded filesystem optionally with given data
 | 
				
			||||||
func RenderTemplate(app *app.App, w http.ResponseWriter, contentPath string, data any) {
 | 
					func RenderTemplate(app *app.App, w http.ResponseWriter, contentPath string, data any) {
 | 
				
			||||||
	templatePath := app.Config.Template.BaseName
 | 
						templatePath := app.Config.Template.BaseName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	t, _ := template.ParseFiles(templatePath, contentPath)
 | 
						templateContent, err := app.Res.ReadFile(templatePath)
 | 
				
			||||||
	err := t.Execute(w, data)
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Println(err)
 | 
				
			||||||
 | 
							http.Error(w, err.Error(), 500)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						t, err := template.New(templatePath).Parse(string(templateContent))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Println(err)
 | 
				
			||||||
 | 
							http.Error(w, err.Error(), 500)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						content, err := app.Res.ReadFile(contentPath)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Println(err)
 | 
				
			||||||
 | 
							http.Error(w, err.Error(), 500)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						t, err = t.Parse(string(content))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Println(err)
 | 
				
			||||||
 | 
							http.Error(w, err.Error(), 500)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = t.Execute(w, data)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		log.Println(err)
 | 
							log.Println(err)
 | 
				
			||||||
		http.Error(w, err.Error(), 500)
 | 
							http.Error(w, err.Error(), 500)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user