// Copyright 2015 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. // This file contains the code to handle template options. package template import "strings" // missingKeyAction defines how to respond to indexing a map with a key that is not present. type missingKeyAction int const ( mapInvalid missingKeyAction = iota // Return an invalid reflect.Value. mapZeroValue // Return the zero value for the map element. mapError // Error out ) type option struct { missingKey missingKeyAction } // Option sets options for the template. Options are described by // strings, either a simple string or "key=value". There can be at // most one equals sign in an option string. If the option string // is unrecognized or otherwise invalid, Option panics. // // Known options: // // missingkey: Control the behavior during execution if a map is // indexed with a key that is not present in the map. // "missingkey=default" or "missingkey=invalid" // The default behavior: Do nothing and continue execution. // If printed, the result of the index operation is the string // "". // "missingkey=zero" // The operation returns the zero value for the map type's element. // "missingkey=error" // Execution stops immediately with an error. // func (t *Template) Option(opt ...string) *Template { t.init() for _, s := range opt { t.setOption(s) } return t } func (t *Template) setOption(opt string) { if opt == "" { panic("empty option string") } elems := strings.Split(opt, "=") switch len(elems) { case 2: // key=value switch elems[0] { case "missingkey": switch elems[1] { case "invalid", "default": t.option.missingKey = mapInvalid return case "zero": t.option.missingKey = mapZeroValue return case "error": t.option.missingKey = mapError return } } } panic("unrecognized option: " + opt) }