github.com/gocaveman/caveman@v0.0.0-20191211162744-0ddf99dbdf6e/i18n/processor.go (about)

     1  package i18n
     2  
     3  import (
     4  	"bytes"
     5  	"html/template"
     6  	"strings"
     7  )
     8  
     9  // Process provides a simple and fast way to execute Go template rendering logic in an i18n string.
    10  // TODO: examples of use-cases
    11  type Processor interface {
    12  	Process(s string, ctx interface{}) (string, error)
    13  }
    14  
    15  // NewDefaultProcessor makes a new instance with default settings.
    16  func NewDefaultProcessor() *DefaultProcessor {
    17  	return &DefaultProcessor{}
    18  }
    19  
    20  // DefaultProcessor is the default implementation of the Processor interface.
    21  type DefaultProcessor struct{}
    22  
    23  func (p *DefaultProcessor) Process(s string, ctx interface{}) (string, error) {
    24  
    25  	// if no template code in string just return as-is
    26  	if !strings.Contains(s, "{{") {
    27  		return s, nil
    28  	}
    29  
    30  	// TODO: LRU cache?
    31  
    32  	var err error
    33  	t := template.New("_")
    34  	t, err = t.Parse(s)
    35  	if err != nil {
    36  		return s, err
    37  	}
    38  
    39  	var buf bytes.Buffer
    40  	err = t.ExecuteTemplate(&buf, "_", ctx)
    41  	if err != nil {
    42  		return s, err
    43  	}
    44  
    45  	return buf.String(), nil
    46  }