blob: 6beb918d991e5e42d025199ec2ccfc3692606801 [file] [log] [blame]
// Copyright 2020 The Fuchsia 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 "src/developer/shell/parser/error.h"
namespace shell::parser {
namespace {
const std::string MATCH_REPLACE("%MATCH%");
} // namespace
fit::function<ParseResult(ParseResult)> ErSkip(
std::string_view message, fit::function<ParseResult(ParseResult)> skip_parser) {
return
[message = std::string(message), skip_parser = std::move(skip_parser)](ParseResult prefix) {
auto skip = skip_parser(prefix);
if (skip && skip.errors() == prefix.errors()) {
auto pos = message.find(MATCH_REPLACE);
auto match_size = skip.offset() - prefix.offset();
if (pos != std::string::npos) {
std::string modified_message(message);
modified_message.replace(pos, MATCH_REPLACE.size(),
skip.unit().substr(prefix.offset(), match_size));
return prefix.Skip(match_size, modified_message);
}
return prefix.Skip(match_size, message);
}
return ParseResult::kEnd;
};
}
fit::function<ParseResult(ParseResult)> ErInsert(std::string_view message) {
return [message = std::string(message)](ParseResult prefix) { return prefix.Expected(message); };
}
} // namespace shell::parser