# Copyright 2017 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.

import("//build/go/go_binary.gni")
import("//build/go/go_library.gni")
import("//build/go/go_test.gni")
import("//third_party/protobuf/proto_library.gni")

proto_library("yamlpb_test_proto") {
  generate_cc = false
  generate_go = true
  generate_python = false
  sources = [
    "yamlpb/yamlpb_test.proto",
  ]

  extra_configs = [
    "$cobalt_root:cobalt_config",
    "$cobalt_root/src/registry:proto_config",
  ]
}

go_library("yamlpb_test_lib") {
  name = "config/config_parser/src/yamlpb"
  source_dir = "$root_gen_dir/go-proto-gen/src/$cobalt_root/src/bin/config_parser/src/yamlpb"
  non_go_deps = [ ":yamlpb_test_proto" ]
  sources = [
    "yamlpb_test.pb.go",
  ]
}

go_library("config_parser") {
  source_dir = "config_parser"

  sources = [
    "config_parser.go",
    "config_reader.go",
    "filter.go",
    "git.go",
    "project_config.go",
    "project_list.go",
  ]

  # Add test files
  sources += [
    "config_reader_test.go",
    "filter_test.go",
    "project_config_test.go",
    "project_list_test.go",
  ]

  deps = [
    ":yamlpb",
    "$cobalt_root/src/registry:cobalt_registry_proto_go",
    "//garnet/public/go/third_party:github.com/golang/glog",
  ]
}

go_test("config_parser_test") {
  gopackages = [ "config_parser" ]

  deps = [
    ":config_parser",
  ]
}

go_library("config_validator") {
  source_dir = "config_validator"
  sources = [
    "metric_definitions.go",
    "report_definitions.go",
    "validator.go",
  ]

  # Add test files
  sources += [
    "metric_definitions_test.go",
    "report_definitions_test.go",
  ]

  deps = [
    ":config_parser",
  ]
}
go_test("config_validator_test") {
  gopackages = [ "config_validator" ]

  deps = [
    ":config_validator",
    "//garnet/public/go/third_party:github.com/golang/glog",
  ]
}

go_library("source_generator") {
  source_dir = "source_generator"
  sources = [
    "cpp.go",
    "dart.go",
    "dep.go",
    "go.go",
    "ident.go",
    "json.go",
    "rust.go",
    "simple.go",
    "source_outputter.go",
    "utils.go",
    "writer.go",
  ]

  # Add test go files
  sources += [
    "dep_test.go",
    "ident_test.go",
    "json_test.go",
    "source_generator_test.go",
    "source_generator_test_files",
    "source_outputter_test.go",
    "utils_test.go",
  ]

  deps = [
    "$cobalt_root/src/registry:cobalt_registry_proto_go",
  ]
}

go_test("source_generator_test") {
  gopackages = [ "source_generator" ]

  deps = [
    ":config_parser",
    ":source_generator",
    "//garnet/public/go/third_party:github.com/golang/glog",
    "//garnet/public/go/third_party:github.com/google/go-cmp",
  ]
}

go_library("yamlpb") {
  source_dir = "yamlpb"
  sources = [
    "yamlpb.go",
    "yamlpb_test.go",
  ]

  deps = [
    "//garnet/public/go/third_party:github.com/go-yaml/yaml",
    "//garnet/public/go/third_party:github.com/golang/protobuf",
  ]
}

go_test("yamlpb_test") {
  gopackages = [ "yamlpb" ]

  deps = [
    ":yamlpb",
    ":yamlpb_test_lib",
    "//garnet/public/go/third_party:github.com/golang/glog",
  ]
}

# This duplicates some source paths, but main needs to be relocated into a
# package path for our go_build rules.
go_library("main") {
  name = "main"

  source_dir = "."
  sources = [
    "config_parser_main.go",
  ]

  deps = [
    ":config_parser",
    ":config_validator",
    ":source_generator",
    "$cobalt_root/src/registry:cobalt_registry_proto_go",
    "//garnet/public/go/third_party:github.com/golang/glog",
    "//garnet/public/go/third_party:github.com/golang/protobuf",
  ]
}

go_binary("bin") {
  gopackage = "main"
  output_name = "config_parser"

  deps = [
    ":main",
  ]
}

group("tests") {
  testonly = true

  deps = [
    ":config_parser_test",
    ":config_validator_test",
    ":source_generator_test",
    ":yamlpb_test",
  ]
}
