From 1334a4adead8b48958d15d4eafb3e44f8c427f39 Mon Sep 17 00:00:00 2001 From: klmp200 Date: Sat, 14 Jul 2018 12:37:50 +0200 Subject: [PATCH] Initial release --- .drone.yml | 6 +++ gowebframework.go | 118 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 .drone.yml create mode 100644 gowebframework.go diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..b6e31fe --- /dev/null +++ b/.drone.yml @@ -0,0 +1,6 @@ +pipeline: + build: + image: golang + commands: + - go get github.com/oxtoacart/bpool + - go build \ No newline at end of file diff --git a/gowebframework.go b/gowebframework.go new file mode 100644 index 0000000..4d0fd9b --- /dev/null +++ b/gowebframework.go @@ -0,0 +1,118 @@ +/* +* @Author: Bartuccio Antoine +* @Date: 2018-07-14 11:32:11 +* @Last Modified by: klmp200 +* @Last Modified time: 2018-07-14 12:36:26 + */ + +package gowebframework + +import ( + "encoding/json" + "fmt" + "github.com/oxtoacart/bpool" + "html/template" + "io/ioutil" + "log" + "net/http" + "path/filepath" +) + +var templates map[string]*template.Template +var buffer_pool *bpool.BufferPool + +type Config struct { + TemplateIncludePath string + TemplateLayoutPath string + MainTemplate string + StaticFolderPath string + TemplateExtensionPattern string + ServerPort string + Domain string + Debug bool +} + +var ServerConfig Config + +func Configure(config_file_name string, custom_config_file_name string) { + loadConfiguration(config_file_name, custom_config_file_name) + loadTemplates() +} + +func loadConfiguration(config_file_name string, custom_config_file_name string) { + default_settings, err := ioutil.ReadFile(config_file_name) + if err != nil { + log.Fatal("No " + config_file_name + " found, exiting") + } + log.Println("Importing settings") + err = json.Unmarshal(default_settings, &ServerConfig) + if err != nil { + log.Fatal("Malformed " + config_file_name) + } + + custom_settings, err := ioutil.ReadFile(custom_config_file_name) + if err != nil { + log.Println("No settings_custom.json fonud, skipping") + return + } + log.Println("Importing custom settings") + err = json.Unmarshal(custom_settings, &ServerConfig) + if err != nil { + log.Fatal("Malformed " + custom_config_file_name) + } +} + +func loadTemplates() { + if templates == nil { + templates = make(map[string]*template.Template) + } + + layoutFiles, err := filepath.Glob(ServerConfig.TemplateLayoutPath + ServerConfig.TemplateExtensionPattern) + if err != nil { + log.Fatal(err) + } + + includeFiles, err := filepath.Glob(ServerConfig.TemplateIncludePath + ServerConfig.TemplateExtensionPattern) + if err != nil { + log.Fatal(err) + } + + mainTemplate := template.New("main") + mainTemplate, err = mainTemplate.Parse(ServerConfig.MainTemplate) + + for _, file := range includeFiles { + fileName := filepath.Base(file) + log.Println("Loading template", fileName) + files := append(layoutFiles, file) + templates[fileName], err = mainTemplate.Clone() + if err != nil { + log.Fatal(err) + } + templates[fileName] = template.Must(templates[fileName].ParseFiles(files...)) + } + log.Println("Templates loading successful") + buffer_pool = bpool.NewBufferPool(64) + log.Println("Buffer allocation sucessful") +} + +func RenderTemplate(w http.ResponseWriter, name string, data interface{}) { + if ServerConfig.Debug { + loadTemplates() + } + + tmpl, is_ok := templates[name] + if !is_ok { + http.Error(w, fmt.Sprintf("The template %s does not exist.", name), + http.StatusInternalServerError) + } + buf := buffer_pool.Get() + defer buffer_pool.Put(buf) + + err := tmpl.Execute(buf, data) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } + + w.Header().Set("Content-Type", "text/html; charset=utf-8") + buf.WriteTo(w) +}