// swift-tools-version:6.0
/*
 * Copyright 2020 Google Inc. All rights reserved.
 *
 * 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 PackageDescription

let package = Package(
  name: "FlatBuffers",
  platforms: [
    .iOS(.v12),
    .macOS(.v10_14),
  ],
  products: [
    .library(
      name: "FlatBuffers",
      targets: ["FlatBuffers"]),
    .library(
      name: "FlexBuffers",
      targets: ["FlexBuffers"]),
  ],
  dependencies: .dependencies,
  targets: [
    .target(
      name: "FlatBuffers",
      dependencies: ["Common"],
      path: "swift/Sources/FlatBuffers",
      swiftSettings: .settings),
    .target(
      name: "FlexBuffers",
      dependencies: ["Common"],
      path: "swift/Sources/FlexBuffers",
      swiftSettings: .settings),
    .target(
      name: "Common",
      path: "swift/Sources/Common",
      swiftSettings: .settings),
    .testTarget(
      name: "FlatbuffersTests",
      dependencies: .dependencies,
      path: "tests/swift/Tests/Flatbuffers"),
    .testTarget(
      name: "FlexbuffersTests",
      dependencies: ["FlexBuffers"],
      path: "tests/swift/Tests/Flexbuffers"),
  ],
  swiftLanguageModes: [.v6])

extension Array where Element == SwiftSetting {
  static var settings: [SwiftSetting] {
    [.enableUpcomingFeature("ExistentialAny")]
  }
}

extension Array where Element == Package.Dependency {
  static var dependencies: [Package.Dependency] {
    #if os(Windows)
    []
    #else
    // Test only Dependency
    [
      .package(url: "https://github.com/grpc/grpc-swift-2.git", from: "2.0.0"),
      .package(
        url: "https://github.com/grpc/grpc-swift-nio-transport.git",
        from: "2.0.0"),
    ]
    #endif
  }
}

extension Array where Element == PackageDescription.Target.Dependency {
  static var dependencies: [PackageDescription.Target.Dependency] {
    #if os(Windows)
    ["FlatBuffers"]
    #else
    // Test only Dependency
    [
      .product(name: "GRPCCore", package: "grpc-swift-2"),
      .product(
        name: "GRPCNIOTransportHTTP2",
        package: "grpc-swift-nio-transport"),
      "FlatBuffers",
    ]
    #endif
  }
}
