code: func InterpolateHIL(s string, vars map[string]string) (string, error) {
  	if strings.Index(s, "${") == -1 {
  		// Skip going to the trouble of parsing something that has no HIL.
  		return s, nil
  	}
  
  	tree, err := hil.Parse(s)
  	if err != nil {
  		return "", err
  	}
  
  	vm := make(map[string]ast.Variable)
  	for k, v := range vars {
  		vm[k] = ast.Variable{
  			Type:  ast.TypeString,
  			Value: v,
  		}
  	}
  
  	config := &hil.EvalConfig{
  		GlobalScope: &ast.BasicScope{
  			VarMap: vm,
  		},
  	}
  
  	result, err := hil.Eval(tree, config)
  	if err != nil {
  		return "", err
  	}
  
  	if result.Type != hil.TypeString {
  		return "", fmt.Errorf("generated unexpected hil type: %s", result.Type)
  	}
  
  	return result.Value.(string), nil
  }
docs: // InterpolateHIL processes the string as if it were HIL and interpolates only
  // the provided string->string map as possible variables.