code: func (t *File_Template) Normalize() error {
  	if t.Body == "" {
  		return errors.New("body is empty")
  	}
  
  	defaultParams := make(map[string]*Value, len(t.Param))
  	for k, param := range t.Param {
  		if k == "" {
  			return fmt.Errorf("param %q: invalid name", k)
  		}
  		if !ParamRegex.MatchString(k) {
  			return fmt.Errorf("param %q: malformed name", k)
  		}
  		if !strings.Contains(t.Body, k) {
  			return fmt.Errorf("param %q: not present in body", k)
  		}
  		if err := param.Normalize(); err != nil {
  			return fmt.Errorf("param %q: %s", k, err)
  		}
  		if param.Default != nil {
  			defaultParams[k] = param.Default
  		} else {
  			defaultParams[k] = param.Schema.Zero()
  		}
  	}
  
  	maybeJSON, err := t.Render(defaultParams)
  	if err != nil {
  		return fmt.Errorf("rendering: %s", err)
  	}
  
  	err = json.Unmarshal([]byte(maybeJSON), &map[string]interface{}{})
  	if err != nil {
  		return fmt.Errorf("parsing rendered body: %s", err)
  	}
  	return nil
  }
docs: // Normalize will normalize the Template message, returning an error if it is
  // invalid.