# Copyright (C) 2020 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("../../../gn/perfetto.gni")

# Track event args parsing logic here is tentatitively planned to eventually
# move to src/util and will be used to implement writing typed args in console
# interceptor.
# Do not add new dependencies to trace_processor code outside of this directory.
#
# TODO(altimin): Move it to src/util and use it in console interceptor.

source_set("util") {
  sources = [ "status_macros.h" ]
  deps = [
    "../../../gn:default_deps",
    "../../../include/perfetto/trace_processor:basic_types",
  ]
}

source_set("protozero_to_text") {
  sources = [
    "protozero_to_text.cc",
    "protozero_to_text.h",
  ]
  deps = [
    ":descriptors",
    "../../../gn:default_deps",
    "../../../protos/perfetto/common:zero",
    "../../../protos/perfetto/trace/track_event:zero",
    "../../base",
    "../../protozero",
    "../importers:gen_cc_track_event_descriptor",
  ]
}

source_set("descriptors") {
  sources = [
    "descriptors.cc",
    "descriptors.h",
  ]
  deps = [
    ":util",
    "../../../gn:default_deps",
    "../../../protos/perfetto/common:zero",
    "../../../protos/perfetto/trace_processor:zero",
    "../../protozero",
    "../importers:gen_cc_track_event_descriptor",
  ]
  public_deps = [ "../../base" ]
}

source_set("proto_to_args_parser") {
  sources = [
    "proto_to_args_parser.cc",
    "proto_to_args_parser.h",
  ]
  deps = [
    "../../../gn:default_deps",
    "../../../protos/perfetto/common:zero",
    "../../../protos/perfetto/trace/interned_data:zero",
    "../../../protos/perfetto/trace_processor:zero",
    "../../protozero",
    "../importers:gen_cc_track_event_descriptor",
  ]

  public_deps = [
    ":descriptors",
    ":util",
    "../../base",

    # TODO(altimin): Move InternedMessageView and TraceBlobView here and remove
    # this dependency.
    "../importers/common",
  ]
}

source_set("unittests") {
  sources = [
    "proto_to_args_parser_unittest.cc",
    "protozero_to_text_unittests.cc",
  ]
  testonly = true
  deps = [
    ":descriptors",
    ":proto_to_args_parser",
    ":protozero_to_text",
    "..:gen_cc_test_messages_descriptor",
    "../../../gn:default_deps",
    "../../../gn:gtest_and_gmock",
    "../../../protos/perfetto/common:zero",
    "../../../protos/perfetto/trace/track_event:zero",
    "../../protozero",
    "../../protozero:testing_messages_zero",
    "../importers:gen_cc_track_event_descriptor",

    # TODO(altimin): Move InternedMessageView and TraceBlobView here and remove
    # this dependency.
    "..:storage_minimal",
  ]
}
