Forráskód Böngészése

添加template函数

yjp 3 hónapja
szülő
commit
5a8c7fc7d7
3 módosított fájl, 194 hozzáadás és 7 törlés
  1. 88 6
      template/template.go
  2. 105 1
      template/template_test.go
  3. 1 0
      template/test_tpl/test.yaml.tpl

+ 88 - 6
template/template.go

@@ -2,7 +2,11 @@ package template
 
 import (
 	"bytes"
+	"git.sxidc.com/go-tools/utils/fileutils"
 	"github.com/Masterminds/sprig/v3"
+	"os"
+	"path/filepath"
+	"strings"
 	"text/template"
 )
 
@@ -14,8 +18,86 @@ func WithDelim(leftDelim string, rightDelim string) ParseTemplateOption {
 	}
 }
 
+func ParseTemplatesDir(templateDir string, outputDir string, params any, opts ...ParseTemplateOption) error {
+	files, err := fileutils.GetDirFiles(templateDir)
+	if err != nil {
+		return err
+	}
+
+	for _, file := range files {
+		subFileName := strings.ReplaceAll(file, templateDir, "")
+		subFileName = strings.TrimSuffix(subFileName, ".tpl")
+
+		outputFile := filepath.Join(outputDir, subFileName)
+		err := ParseTemplateFileToFile(file, outputFile, params, opts...)
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func ParseTemplateFileToFile(inputFilePath string, outputFilePath string, params any, opts ...ParseTemplateOption) error {
+	parsedBytes, err := ParseTemplateFileToBytes(inputFilePath, params, opts...)
+	if err != nil {
+		return err
+	}
+
+	outputDir := filepath.Dir(outputFilePath)
+	if !fileutils.PathExists(outputDir) {
+		err := os.MkdirAll(outputDir, os.ModeDir|os.ModePerm)
+		if err != nil {
+			return err
+		}
+	}
+
+	err = os.WriteFile(outputFilePath, parsedBytes, os.ModePerm)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+func ParseTemplateFileToString(inputFilePath string, params any, opts ...ParseTemplateOption) (string, error) {
+	inputBytes, err := os.ReadFile(inputFilePath)
+	if err != nil {
+		return "", err
+	}
+
+	parsedBytes, err := parseTemplateStringToBytes(newTemplate(inputFilePath, opts...), string(inputBytes), params)
+	if err != nil {
+		return "", err
+	}
+
+	return string(parsedBytes), nil
+}
+
+func ParseTemplateFileToBytes(inputFilePath string, params any, opts ...ParseTemplateOption) ([]byte, error) {
+	inputBytes, err := os.ReadFile(inputFilePath)
+	if err != nil {
+		return nil, err
+	}
+
+	return parseTemplateStringToBytes(newTemplate(inputFilePath, opts...), string(inputBytes), params)
+}
+
 func ParseTemplateStringToString(inputStr string, params any, opts ...ParseTemplateOption) (string, error) {
-	tpl := template.New(inputStr)
+	parsedBytes, err := parseTemplateStringToBytes(newTemplate(inputStr, opts...), inputStr, params)
+	if err != nil {
+		return "", err
+	}
+
+	return string(parsedBytes), nil
+}
+
+func ParseTemplateStringToBytes(inputStr string, params any, opts ...ParseTemplateOption) ([]byte, error) {
+	return parseTemplateStringToBytes(newTemplate(inputStr, opts...), inputStr, params)
+}
+
+func newTemplate(name string, opts ...ParseTemplateOption) *template.Template {
+	tpl := template.New(name)
 
 	for _, opt := range opts {
 		opt(tpl)
@@ -24,20 +106,20 @@ func ParseTemplateStringToString(inputStr string, params any, opts ...ParseTempl
 	tpl.Funcs(sprig.FuncMap())
 	tpl.Funcs(templateFuncMap)
 
-	return parseTemplateStringToString(tpl, inputStr, params)
+	return tpl
 }
 
-func parseTemplateStringToString(tpl *template.Template, inputStr string, params any) (string, error) {
+func parseTemplateStringToBytes(tpl *template.Template, inputStr string, params any) ([]byte, error) {
 	tpl, err := tpl.Parse(inputStr)
 	if err != nil {
-		return "", err
+		return nil, err
 	}
 
 	buffer := &bytes.Buffer{}
 	err = tpl.Execute(buffer, params)
 	if err != nil {
-		return "", err
+		return nil, err
 	}
 
-	return buffer.String(), nil
+	return buffer.Bytes(), nil
 }

+ 105 - 1
template/template_test.go

@@ -1,12 +1,102 @@
 package template
 
-import "testing"
+import (
+	"os"
+	"path/filepath"
+	"testing"
+)
+
+const (
+	templateYamlFile   = "test_tpl/test.yaml.tpl"
+	parsedYamlDir      = "test_tpl_parsed"
+	parsedYamlFileName = "test.yaml"
+)
 
 const (
 	templateYaml = `[[ .key ]]: "[[ .value ]]"`
 	parsedYaml   = `key: "value"`
 )
 
+func TestParseTemplatesDir(t *testing.T) {
+	err := ParseTemplatesDir("test_tpl", parsedYamlDir, map[string]any{
+		"key":   "key",
+		"value": "value",
+	}, WithDelim("[[", "]]"))
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	defer func() {
+		err := os.RemoveAll(parsedYamlDir)
+		if err != nil {
+			t.Fatal(err)
+		}
+	}()
+
+	parsedBytes, err := os.ReadFile(filepath.Join(parsedYamlDir, parsedYamlFileName))
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if string(parsedBytes) != parsedYaml {
+		t.Fatal("渲染后的模板值不一致")
+	}
+}
+
+func TestParseTemplateFileToFile(t *testing.T) {
+	err := ParseTemplateFileToFile(templateYamlFile, parsedYamlFileName, map[string]any{
+		"key":   "key",
+		"value": "value",
+	}, WithDelim("[[", "]]"))
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	defer func() {
+		err := os.RemoveAll(parsedYamlFileName)
+		if err != nil {
+			t.Fatal(err)
+		}
+	}()
+
+	parsedBytes, err := os.ReadFile(parsedYamlFileName)
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if string(parsedBytes) != parsedYaml {
+		t.Fatal("渲染后的模板值不一致")
+	}
+}
+
+func TestParseTemplateFileToString(t *testing.T) {
+	parsed, err := ParseTemplateFileToString(templateYamlFile, map[string]any{
+		"key":   "key",
+		"value": "value",
+	}, WithDelim("[[", "]]"))
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if parsed != parsedYaml {
+		t.Fatal("渲染后的模板值不一致")
+	}
+}
+
+func TestParseTemplateFileToBytes(t *testing.T) {
+	parsedBytes, err := ParseTemplateFileToBytes(templateYamlFile, map[string]any{
+		"key":   "key",
+		"value": "value",
+	}, WithDelim("[[", "]]"))
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if string(parsedBytes) != parsedYaml {
+		t.Fatal("渲染后的模板值不一致")
+	}
+}
+
 func TestParseTemplateStringToString(t *testing.T) {
 	parsed, err := ParseTemplateStringToString(templateYaml, map[string]any{
 		"key":   "key",
@@ -20,3 +110,17 @@ func TestParseTemplateStringToString(t *testing.T) {
 		t.Fatal("渲染后的模板值不一致")
 	}
 }
+
+func TestParseTemplateStringToBytes(t *testing.T) {
+	parsedBytes, err := ParseTemplateStringToBytes(templateYaml, map[string]any{
+		"key":   "key",
+		"value": "value",
+	}, WithDelim("[[", "]]"))
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if string(parsedBytes) != parsedYaml {
+		t.Fatal("渲染后的模板值不一致")
+	}
+}

+ 1 - 0
template/test_tpl/test.yaml.tpl

@@ -0,0 +1 @@
+[[ .key ]]: "[[ .value ]]"