// Copyright 2019 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.

#ifndef TOOLS_FIDLCAT_LIB_DECODE_OPTIONS_H_
#define TOOLS_FIDLCAT_LIB_DECODE_OPTIONS_H_

#include <regex.h>

#include <memory>
#include <string>
#include <vector>

#include "src/lib/fxl/macros.h"

enum StackLevel { kNoStack = 0, kPartialStack = 1, kFullStack = 2 };
enum class InputMode { kDevice, kFile };
enum class OutputMode { kNone, kStandard, kTextProtobuf };

class Regex {
 public:
  explicit Regex(regex_t filter) : filter_(filter) {}
  ~Regex() { regfree(&filter_); }
  FXL_DISALLOW_COPY_AND_ASSIGN(Regex);

  bool Matches(const std::string& string) {
    return regexec(&filter_, string.c_str(), 0, nullptr, 0) == 0;
  }

 private:
  regex_t filter_;
};

struct DecodeOptions {
  // Level of stack we want to decode/display.
  int stack_level = kNoStack;
  // If a syscall satisfies one of these filters, it can be displayed.
  std::vector<std::unique_ptr<Regex>> syscall_filters;
  // But it is only displayed if it doesn't satisfy any of these filters.
  std::vector<std::unique_ptr<Regex>> exclude_syscall_filters;
  // If a message method name satisfies one of these filters, it can be displayed.
  std::vector<std::unique_ptr<Regex>> message_filters;
  // But it is only displayed if it doesn't satisfy any of these filters.
  std::vector<std::unique_ptr<Regex>> exclude_message_filters;
  // If this is not empty, messages and syscalls are only displayed when a message method name
  // satisfies one of these filters.
  std::vector<std::unique_ptr<Regex>> trigger_filters;
  // Input mode.
  InputMode input_mode = InputMode::kDevice;
  // Output mode.
  OutputMode output_mode = OutputMode::kNone;
  // File name used to save the session.
  std::string save;

  bool SatisfiesMessageFilters(const std::string& name) const {
    for (const auto& filter : exclude_message_filters) {
      if (filter->Matches(name)) {
        return false;
      }
    }
    for (const auto& filter : message_filters) {
      if (filter->Matches(name)) {
        return true;
      }
    }
    return message_filters.empty();
  }

  bool IsTrigger(const std::string& name) const {
    for (const auto& filter : trigger_filters) {
      if (filter->Matches(name)) {
        return true;
      }
    }
    return false;
  }
};

#endif  // TOOLS_FIDLCAT_LIB_DECODE_OPTIONS_H_
