// 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
