// Functions and methods to parse a single template.
-// MustParse parses the template definition string to construct an internal
-// representation of the template for execution.
-// It panics if the template cannot be parsed.
-func (t *Template) MustParse(text string) *Template {
- if err := t.Parse(text); err != nil {
+// Must is a helper that wraps a call to a function returning (*Template, os.Error)
+// and panics if the error is non-nil. It is intended for use in variable initializations
+// such as
+// var t = template.Must(template.Parse("text"))
+func Must(t *Template, err os.Error) *Template {
+ if err != nil {
panic(err)
}
return t
}
+// ParseFile creates a new Template and parses the template definition from
+// the named file. The template name is the base name of the file.
+func ParseFile(filename string) (*Template, os.Error) {
+ t := New(filepath.Base(filename))
+ return t.ParseFile(filename)
+}
+
+// parseFileInSet creates a new Template and parses the template
+// definition from the named file. The template name is the base name
+// of the file. It also adds the template to the set. Function bindings are
+// checked against those in the set.
+func parseFileInSet(filename string, set *Set) (*Template, os.Error) {
+ t := New(filepath.Base(filename))
+ return t.parseFileInSet(filename, set)
+}
+
// ParseFile reads the template definition from a file and parses it to
// construct an internal representation of the template for execution.
-func (t *Template) ParseFile(filename string) os.Error {
+func (t *Template) ParseFile(filename string) (*Template, os.Error) {
b, err := ioutil.ReadFile(filename)
if err != nil {
- return err
+ return t, err
}
return t.Parse(string(b))
}
-// ParseFileInSet is the same as ParseFile except that function bindings
+// parseFileInSet is the same as ParseFile except that function bindings
// are checked against those in the set and the template is added
// to the set.
-func (t *Template) ParseFileInSet(filename string, set *Set) os.Error {
+func (t *Template) parseFileInSet(filename string, set *Set) (*Template, os.Error) {
b, err := ioutil.ReadFile(filename)
if err != nil {
- return err
+ return t, err
}
return t.ParseInSet(string(b), set)
}
-// MustParseFile reads the template definition from a file and parses it to
-// construct an internal representation of the template for execution.
-// It panics if the file cannot be read or the template cannot be parsed.
-func (t *Template) MustParseFile(filename string) *Template {
- if err := t.ParseFile(filename); err != nil {
- panic(err)
- }
- return t
-}
-
-// ParseFile creates a new Template and parses the template definition from
-// the named file. The template name is the base name of the file.
-func ParseFile(filename string) (*Template, os.Error) {
- t := New(filepath.Base(filename))
- return t, t.ParseFile(filename)
-}
-
-// ParseFileInSet creates a new Template and parses the template
-// definition from the named file. The template name is the base name
-// of the file. It also adds the template to the set. Function bindings are
-//checked against those in the set.
-func ParseFileInSet(filename string, set *Set) (*Template, os.Error) {
- t := New(filepath.Base(filename))
- return t, t.ParseFileInSet(filename, set)
-}
-
-// MustParseFile creates a new Template and parses the template definition
-// from the named file. The template name is the base name of the file.
-// It panics if the file cannot be read or the template cannot be parsed.
-func MustParseFile(filename string) *Template {
- return New(filepath.Base(filename)).MustParseFile(filename)
-}
-
// Functions and methods to parse a set.
-// MustParse parses a string into a set of named templates.
-// It panics if the set cannot be parsed.
-func (s *Set) MustParse(text string) *Set {
- if err := s.Parse(text); err != nil {
+// SetMust is a helper that wraps a call to a function returning (*Set, os.Error)
+// and panics if the error is non-nil. It is intended for use in variable initializations
+// such as
+// var s = template.SetMust(template.ParseSetFile("file"))
+func SetMust(s *Set, err os.Error) *Set {
+ if err != nil {
panic(err)
}
return s
// ParseFile parses the named files into a set of named templates.
// Each file must be parseable by itself. Parsing stops if an error is
// encountered.
-func (s *Set) ParseFile(filenames ...string) os.Error {
+func (s *Set) ParseFile(filenames ...string) (*Set, os.Error) {
for _, filename := range filenames {
b, err := ioutil.ReadFile(filename)
if err != nil {
- return err
+ return s, err
}
- err = s.Parse(string(b))
+ _, err = s.Parse(string(b))
if err != nil {
- return err
+ return s, err
}
}
- return nil
-}
-
-// MustParseFile parses the named file into a set of named templates.
-// Each file must be parseable by itself.
-// MustParseFile panics if any file cannot be read or parsed.
-func (s *Set) MustParseFile(filenames ...string) *Set {
- err := s.ParseFile(filenames...)
- if err != nil {
- panic(err)
- }
- return s
+ return s, nil
}
// ParseSetFile creates a new Set and parses the set definition from the
// named files. Each file must be individually parseable.
-func ParseSetFile(filenames ...string) (set *Set, err os.Error) {
+func ParseSetFile(filenames ...string) (*Set, os.Error) {
s := new(Set)
- var b []byte
for _, filename := range filenames {
- b, err = ioutil.ReadFile(filename)
+ b, err := ioutil.ReadFile(filename)
if err != nil {
- return
+ return s, err
}
- err = s.Parse(string(b))
+ _, err = s.Parse(string(b))
if err != nil {
- return
+ return s, err
}
}
return s, nil
}
-// MustParseSetFile creates a new Set and parses the set definition from the
-// named files. Each file must be individually parseable.
-// MustParseSetFile panics if any file cannot be read or parsed.
-func MustParseSetFile(filenames ...string) *Set {
- s, err := ParseSetFile(filenames...)
- if err != nil {
- panic(err)
- }
- return s
-}
-
// ParseFiles parses the set definition from the files identified by the
// pattern. The pattern is processed by filepath.Glob and must match at
// least one file.
-func (s *Set) ParseFiles(pattern string) os.Error {
+func (s *Set) ParseFiles(pattern string) (*Set, os.Error) {
filenames, err := filepath.Glob(pattern)
if err != nil {
- return err
+ return s, err
}
if len(filenames) == 0 {
- return fmt.Errorf("pattern matches no files: %#q", pattern)
+ return s, fmt.Errorf("pattern matches no files: %#q", pattern)
}
return s.ParseFile(filenames...)
}
// files identified by the pattern. The pattern is processed by filepath.Glob
// and must match at least one file.
func ParseSetFiles(pattern string) (*Set, os.Error) {
- set := new(Set)
- err := set.ParseFiles(pattern)
+ set, err := new(Set).ParseFiles(pattern)
if err != nil {
- return nil, err
+ return set, err
}
return set, nil
}
-// MustParseSetFiles creates a new Set and parses the set definition from the
-// files identified by the pattern. The pattern is processed by filepath.Glob.
-// MustParseSetFiles panics if the pattern is invalid or a matched file cannot be
-// read or parsed.
-func MustParseSetFiles(pattern string) *Set {
- set, err := ParseSetFiles(pattern)
- if err != nil {
- panic(err)
- }
- return set
-}
-
// Functions and methods to parse stand-alone template files into a set.
// ParseTemplateFile parses the named template files and adds
// individual templates, which are then added to the set.
// Each file must be parseable by itself. Parsing stops if an error is
// encountered.
-func (s *Set) ParseTemplateFile(filenames ...string) os.Error {
+func (s *Set) ParseTemplateFile(filenames ...string) (*Set, os.Error) {
for _, filename := range filenames {
- _, err := ParseFileInSet(filename, s)
+ _, err := parseFileInSet(filename, s)
if err != nil {
- return err
+ return s, err
}
}
- return nil
-}
-
-// MustParseTemplateFile is like ParseTemplateFile but
-// panics if there is an error.
-func (s *Set) MustParseTemplateFile(filenames ...string) *Set {
- err := s.ParseTemplateFile(filenames...)
- if err != nil {
- panic(err)
- }
- return s
+ return s, nil
}
// ParseTemplateFiles parses the template files matched by the
// individual templates, which are then added to the set.
// Each file must be parseable by itself. Parsing stops if an error is
// encountered.
-func (s *Set) ParseTemplateFiles(pattern string) os.Error {
+func (s *Set) ParseTemplateFiles(pattern string) (*Set, os.Error) {
filenames, err := filepath.Glob(pattern)
if err != nil {
- return err
+ return s, err
}
for _, filename := range filenames {
- _, err := ParseFileInSet(filename, s)
+ _, err := parseFileInSet(filename, s)
if err != nil {
- return err
+ return s, err
}
}
- return nil
-}
-
-// MustParseTemplateFile is like ParseTemplateFiles but
-// panics if there is an error.
-func (s *Set) MustParseTemplateFiles(pattern string) *Set {
- err := s.ParseTemplateFiles(pattern)
- if err != nil {
- panic(err)
- }
- return s
+ return s, nil
}
// ParseTemplateFile creates a set by parsing the named files,
for _, filename := range filenames {
t, err := ParseFile(filename)
if err != nil {
- return nil, err
+ return set, err
}
if err := set.add(t); err != nil {
- return nil, err
+ return set, err
}
}
return set, nil
}
-// MustParseTemplateFile is like ParseTemplateFile but
-// panics if there is an error.
-func MustParseTemplateFile(filenames ...string) *Set {
- set, err := ParseTemplateFile(filenames...)
- if err != nil {
- panic(err)
- }
- return set
-}
-
// ParseTemplateFiles creates a set by parsing the files matched
// by the pattern, each of which defines a single template. Each
// template will named the base name of its file.
// Each file must be parseable by itself. Parsing stops if an error is
// encountered.
func ParseTemplateFiles(pattern string) (*Set, os.Error) {
+ set := new(Set)
filenames, err := filepath.Glob(pattern)
if err != nil {
- return nil, err
+ return set, err
}
- set := new(Set)
for _, filename := range filenames {
t, err := ParseFile(filename)
if err != nil {
- return nil, err
+ return set, err
}
if err := set.add(t); err != nil {
- return nil, err
+ return set, err
}
}
return set, nil
}
-
-// MustParseTemplateFiles is like ParseTemplateFiles but
-// panics if there is a parse error or other problem
-// constructing the set.
-func MustParseTemplateFiles(pattern string) *Set {
- set, err := ParseTemplateFiles(pattern)
- if err != nil {
- panic(err)
- }
- return set
-}
func TestSetParse(t *testing.T) {
for _, test := range setParseTests {
- set := new(Set)
- err := set.Parse(test.input)
+ set, err := new(Set).Parse(test.input)
switch {
case err == nil && !test.ok:
t.Errorf("%q: expected error; got none", test.name)
}
continue
}
+ if set == nil {
+ continue
+ }
if len(set.tmpl) != len(test.names) {
t.Errorf("%s: wrong number of templates; wanted %d got %d", test.name, len(test.names), len(set.tmpl))
continue
func TestSetExecute(t *testing.T) {
// Declare a set with a couple of templates first.
- set := new(Set)
- err := set.Parse(setText1)
+ set, err := new(Set).Parse(setText1)
if err != nil {
t.Fatalf("error parsing set: %s", err)
}
- err = set.Parse(setText2)
+ _, err = set.Parse(setText2)
if err != nil {
t.Fatalf("error parsing set: %s", err)
}
}
func TestSetParseFile(t *testing.T) {
- set := new(Set)
- err := set.ParseFile("DOES NOT EXIST")
+ set, err := new(Set).ParseFile("DOES NOT EXIST")
if err == nil {
t.Error("expected error for non-existent file; got none")
}
- err = set.ParseFile("testdata/file1.tmpl", "testdata/file2.tmpl")
+ _, err = set.ParseFile("testdata/file1.tmpl", "testdata/file2.tmpl")
if err != nil {
t.Fatalf("error parsing files: %v", err)
}
}
func TestSetParseFiles(t *testing.T) {
- set := new(Set)
- err := set.ParseFiles("DOES NOT EXIST")
+ set, err := new(Set).ParseFiles("DOES NOT EXIST")
if err == nil {
t.Error("expected error for non-existent file; got none")
}
- err = set.ParseFiles("[x")
+ _, err = set.ParseFiles("[x")
if err == nil {
t.Error("expected error for bad pattern; got none")
}
- err = set.ParseFiles("testdata/file*.tmpl")
+ _, err = set.ParseFiles("testdata/file*.tmpl")
if err != nil {
t.Fatalf("error parsing files: %v", err)
}
}
var templateFileExecTests = []execTest{
- {"teset", `{{template "tmpl1.tmpl"}}{{template "tmpl2.tmpl"}}`, "template1\ntemplate2\n", 0, true},
+ {"test", `{{template "tmpl1.tmpl"}}{{template "tmpl2.tmpl"}}`, "template1\ntemplate2\n", 0, true},
}
func TestSetParseTemplateFile(t *testing.T) {
- set := new(Set)
- err := set.ParseTemplateFile("DOES NOT EXIST")
+ set, err := ParseTemplateFile("DOES NOT EXIST")
if err == nil {
t.Error("expected error for non-existent file; got none")
}
- err = set.ParseTemplateFile("testdata/tmpl1.tmpl", "testdata/tmpl2.tmpl")
+ _, err = set.ParseTemplateFile("testdata/tmpl1.tmpl", "testdata/tmpl2.tmpl")
if err != nil {
t.Fatalf("error parsing files: %v", err)
}
}
func TestSetParseTemplateFiles(t *testing.T) {
- set := new(Set)
- err := set.ParseTemplateFiles("DOES NOT EXIST")
+ set, err := ParseTemplateFiles("DOES NOT EXIST")
if err == nil {
t.Error("expected error for non-existent file; got none")
}
- err = set.ParseTemplateFiles("[x")
+ _, err = set.ParseTemplateFiles("[x")
if err == nil {
t.Error("expected error for bad pattern; got none")
}
- err = set.ParseTemplateFiles("testdata/tmpl*.tmpl")
+ _, err = set.ParseTemplateFiles("testdata/tmpl*.tmpl")
if err != nil {
t.Fatalf("error parsing files: %v", err)
}