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

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;

  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_
