blob: 387f54829a8ab0899ce9c737cb9f509686a54541 [file] [log] [blame]
/*
* Copyright 2022 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "src/base/SkStringView.h"
#include "tools/skslc/ProcessWorklist.h"
#include <algorithm>
#include <fstream>
#include <vector>
ResultCode ProcessWorklist(
const char* worklistPath,
const std::function<ResultCode(SkSpan<std::string> args)>& processCommandFn) {
std::string inputPath(worklistPath);
if (!skstd::ends_with(inputPath, ".worklist")) {
printf("expected .worklist file, found: %s\n\n", worklistPath);
return ResultCode::kConfigurationError;
}
// The worklist contains one line per argument to pass. When a blank line is reached, those
// arguments will be passed to `processCommandFn`.
auto resultCode = ResultCode::kSuccess;
std::vector<std::string> args = {"sksl"};
std::ifstream in(worklistPath);
for (std::string line; std::getline(in, line); ) {
if (in.rdstate()) {
printf("error reading '%s'\n", worklistPath);
return ResultCode::kInputError;
}
if (!line.empty()) {
// We found an argument. Remember it.
args.push_back(std::move(line));
} else {
// We found a blank line. If we have any arguments stored up, process them as a command.
if (!args.empty()) {
ResultCode outcome = processCommandFn(args);
resultCode = std::max(resultCode, outcome);
// Clear every argument except the first.
args.resize(1);
}
}
}
// If the worklist ended with a list of arguments but no blank line, process those now.
if (args.size() > 1) {
ResultCode outcome = processCommandFn(args);
resultCode = std::max(resultCode, outcome);
}
// Return the "worst" status we encountered. For our purposes, compilation errors are the least
// serious, because they are expected to occur in unit tests. Other types of errors are not
// expected at all during a build.
return resultCode;
}