init()

in src/Tulsi/TulsiCommandlineParser.swift [136:264]


  init() {
    var args = [String](CommandLine.arguments.dropFirst())
    // See if the arguments are intended to be interpreted as commandline args.
    if args.first != TulsiCommandlineParser.ParamCommandlineArgumentSentinal {
      commandlineSentinalFound = false
      arguments = Arguments()
      return
    }
    commandlineSentinalFound = true

    args = [String](args.dropFirst())

    var parsedArguments = [String: Any]()
    func storeValueAt(_ index: Int,
                      forArgument argumentName: String,
                      append: Bool = false,
                      transform: ((AnyObject) -> AnyObject) = { return $0 }) {
      guard index < args.count else {
        print("Missing required parameter for \(argumentName) option.")
        exit(1)
      }
      let value = transform(args[index] as AnyObject)
      if append {
        if var existingArgs: [AnyObject] = parsedArguments[argumentName] as? [AnyObject] {
          existingArgs.append(value)
          parsedArguments[argumentName] = existingArgs as AnyObject?
        } else {
          parsedArguments[argumentName] = [value]
        }
      } else {
        parsedArguments[argumentName] = value
      }
    }

    var i = 0
    while i < args.count {
      let arg = args[i]
      i += 1
      switch arg {

        // Commmon:

        case TulsiCommandlineParser.ParamHelpShort:
          fallthrough
        case TulsiCommandlineParser.ParamHelpLong:
          TulsiCommandlineParser.printUsage()
          exit(1)

        case TulsiCommandlineParser.ParamVerboseShort:
          fallthrough
        case TulsiCommandlineParser.ParamVerboseLong:
          parsedArguments[TulsiCommandlineParser.ParamVerboseLong] = true as AnyObject?
        case TulsiCommandlineParser.ParamQuietShort:
          fallthrough
        case TulsiCommandlineParser.ParamQuietLong:
          parsedArguments[TulsiCommandlineParser.ParamQuietLong] = true as AnyObject?

        case TulsiCommandlineParser.ParamBazel:
          storeValueAt(i, forArgument: TulsiCommandlineParser.ParamBazel)
          i += 1

        case TulsiCommandlineParser.ParamOutputFolderShort:
          fallthrough
        case TulsiCommandlineParser.ParamOutputFolderLong:
          storeValueAt(i, forArgument: TulsiCommandlineParser.ParamOutputFolderLong)
          i += 1

        case TulsiCommandlineParser.ParamWorkspaceRootShort:
          fallthrough
        case TulsiCommandlineParser.ParamWorkspaceRootLong:
          storeValueAt(i, forArgument: TulsiCommandlineParser.ParamWorkspaceRootLong)
          i += 1

        case TulsiCommandlineParser.ParamAdditionalPathFilters:
          storeValueAt(i, forArgument: TulsiCommandlineParser.ParamAdditionalPathFilters) { value -> AnyObject in
            guard let valueString = value as? String else { return Set<String>() as AnyObject }

            let pathFilters = valueString.components(separatedBy: " ").map() { path -> String in
              if path.hasPrefix("//") {
                let index = path.index(path.startIndex, offsetBy: 2)
                return String(path[index...])
              }
              return path
            }
            return Set(pathFilters) as AnyObject
          }
          i += 1

        // Xcode project generation:

        case TulsiCommandlineParser.ParamGeneratorConfigShort:
          fallthrough
        case TulsiCommandlineParser.ParamGeneratorConfigLong:
          storeValueAt(i, forArgument: TulsiCommandlineParser.ParamGeneratorConfigLong)
          i += 1

        case TulsiCommandlineParser.ParamNoOpenXcode:
          parsedArguments[TulsiCommandlineParser.ParamNoOpenXcode] = true as AnyObject?

        // Tulsiproj creation:

        case TulsiCommandlineParser.ParamCreateTulsiProj:
          storeValueAt(i, forArgument: TulsiCommandlineParser.ParamCreateTulsiProj)
          i += 1

        case TulsiCommandlineParser.ParamBuildStartupOptions:
          storeValueAt(i, forArgument: TulsiCommandlineParser.ParamBuildStartupOptions)
          i += 1

        case TulsiCommandlineParser.ParamBuildOptions:
          storeValueAt(i, forArgument: TulsiCommandlineParser.ParamBuildOptions)
          i += 1

        case TulsiCommandlineParser.ParamBuildTargetShort:
          fallthrough
        case TulsiCommandlineParser.ParamBuildTargetLong:
          storeValueAt(i, forArgument: TulsiCommandlineParser.ParamBuildTargetLong, append: true)
          i += 1

      case TulsiCommandlineParser.ParamLogToFile:
        parsedArguments[TulsiCommandlineParser.ParamLogToFile] = true as AnyObject?

        default:
          print("Ignoring unknown option \"\(arg)\"")
      }
    }

    arguments = Arguments(dict: parsedArguments)
  }