  * If `templateFullPath` is empty `""`, search the template named `prefix-templateShortName`
    in the Application Support directory first, then in the bundled templates,
    and returns the path if found (throws if none is found)
+ * If both or neither are empty, an error will be thrown
 
  - parameter prefix:            the prefix for the template, typically name of one of the SwiftGen subcommand
                                 like `strings`, `colors`, etc
- - parameter templateShortName: the short name of the template, might be `"default"` or any custom name
+ - parameter templateShortName: the short name of the template
  - parameter templateFullPath:  the full path of the template to find. If this is set to an existing file, it
                                 returns that Path without even using `prefix` and `templateShortName` parameters.
 

 - returns: The Path matching the template to find
 */
func findTemplate(prefix: String, templateShortName: String, templateFullPath: String) throws -> Path {
  guard templateFullPath.isEmpty else {
    let fullPath = Path(templateFullPath)
    guard fullPath.isFile else {
      throw TemplateError.templatePathNotFound(path: fullPath)
    }
    return fullPath
  }

  var path = appSupportTemplatesPath + "\(prefix)-\(templateShortName).stencil"
  if !path.isFile {
    path = bundledTemplatesPath + "\(prefix)-\(templateShortName).stencil"
  }
  guard path.isFile else {
    throw TemplateError.namedTemplateNotFound(name: templateShortName)
  }
  return path
}

enum TemplateError: Error, CustomStringConvertible {
  case namedTemplateNotFound(name: String)
  case templatePathNotFound(path: Path)
  case noTemplateFound
  case multipleTemplateOptions(path: String, name: String)
  case deprecated(option: String, replacement: String)

  var description: String {
