// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package parse

import (
	"fmt"
	"os"
	"strconv"
)

// Set returns a slice of Trees created by parsing the template set
// definition in the argument string. If an error is encountered,
// parsing stops and an empty slice is returned with the error.
func Set(text, leftDelim, rightDelim string, funcs ...map[string]interface{}) (tree map[string]*Tree, err os.Error) {
	tree = make(map[string]*Tree)
	defer (*Tree)(nil).recover(&err)
	lex := lex("set", text, leftDelim, rightDelim)
	const context = "define clause"
	for {
		t := New("set") // name will be updated once we know it.
		t.startParse(funcs, lex)
		// Expect EOF or "{{ define name }}".
		if t.atEOF() {
			break
		}
		t.expect(itemLeftDelim, context)
		t.expect(itemDefine, context)
		name := t.expect(itemString, context)
		t.Name, err = strconv.Unquote(name.val)
		if err != nil {
			t.error(err)
		}
		t.expect(itemRightDelim, context)
		end := t.parse(false)
		if end == nil {
			t.errorf("unexpected EOF in %s", context)
		}
		if end.Type() != nodeEnd {
			t.errorf("unexpected %s in %s", end, context)
		}
		t.stopParse()
		if _, present := tree[t.Name]; present {
			return nil, fmt.Errorf("template: %q multiply defined", name)
		}
		tree[t.Name] = t
	}
	return
}
