/*
 * Copyright 2021 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.
 */

#if !os(WASI)
import Foundation
#else
import SwiftOverlayShims
#endif

/// `VerifierOptions` is a set of options to verify a flatbuffer
public struct VerifierOptions {

  /// Maximum `Apparent` size if the buffer can be expanded into a DAG tree
  internal var _maxApparentSize: UOffset

  /// Maximum table count allowed in a buffer
  internal var _maxTableCount: UOffset

  /// Maximum depth allowed in a buffer
  internal var _maxDepth: UOffset

  /// Ignoring missing null terminals in strings
  internal var _ignoreMissingNullTerminators: Bool

  /// initializes the set of options for the verifier
  /// - Parameters:
  ///   - maxDepth: Maximum depth allowed in a buffer
  ///   - maxTableCount: Maximum table count allowed in a buffer
  ///   - maxApparentSize: Maximum `Apparent` size if the buffer can be expanded into a DAG tree
  ///   - ignoreMissingNullTerminators: Ignoring missing null terminals in strings *Currently not supported in swift*
  public init(
    maxDepth: UOffset = 64,
    maxTableCount: UOffset = 1000000,
    maxApparentSize: UOffset = 1 << 31,
    ignoreMissingNullTerminators: Bool = false)
  {
    _maxDepth = maxDepth
    _maxTableCount = maxTableCount
    _maxApparentSize = maxApparentSize
    _ignoreMissingNullTerminators = ignoreMissingNullTerminators
  }

}
