blob: 20f21bad850407d2fcfdf9d70d76241ed24711ba [file] [log] [blame]
// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "foomatic_shell/grammar.h"
#include <base/logging.h>
#include <base/strings/string_number_conversions.h>
namespace foomatic_shell {
namespace {
// Returns the position of the beginning of given StringAtom.
std::string::const_iterator Position(const StringAtom& str) {
DCHECK(!str.components.empty());
return str.components.front().begin;
}
} // namespace
std::string Value(const StringAtom& str) {
std::string out;
for (auto& s : str.components)
out += s.value;
return out;
}
std::string::const_iterator Position(const PipeSegment& segment) {
if (segment.command)
return Position(*segment.command);
DCHECK(segment.script != nullptr);
return Position(*segment.script);
}
std::string::const_iterator Position(const Command& cmd) {
if (!cmd.variables_with_values.empty())
return Position(cmd.variables_with_values.front().new_value);
return cmd.application.begin;
}
std::string::const_iterator Position(const Script& script) {
DCHECK(!script.pipelines.empty());
DCHECK(!script.pipelines.front().segments.empty());
return Position(script.pipelines.front().segments.front());
}
std::string CreateErrorLog(const std::string& source,
std::string::const_iterator position,
const std::string& msg) {
std::string out = msg + ". ";
out += "Error occurred";
if (position >= source.begin() || position < source.end()) {
out +=
" at position " + base::NumberToString(position - source.begin() + 1);
}
out += " in the script: \"" + source + "\".";
return out;
}
} // namespace foomatic_shell