| // 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 |
| // "<no value>". |
| // "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 { |
| 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) |
| } |