///
/// RequestOptions.swift
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/nitro
/// Copyright © 2024 Marc Rousavy @ Margelo
///

import NitroModules

/**
 * Represents an instance of `RequestOptions`, backed by a C++ struct.
 */
public typealias RequestOptions = margelo.nitro.fastio.RequestOptions

public extension RequestOptions {
  private typealias bridge = margelo.nitro.fastio.bridge.swift

  /**
   * Create a new instance of `RequestOptions`.
   */
  init(url: String, method: RequestMethod, body: (any HybridInputStreamSpec)?) {
    self.init(std.string(url), method, { () -> bridge.std__optional_std__shared_ptr_margelo__nitro__fastio__HybridInputStreamSpec__ in
      if let __unwrappedValue = body {
        return bridge.create_std__optional_std__shared_ptr_margelo__nitro__fastio__HybridInputStreamSpec__({ () -> bridge.std__shared_ptr_margelo__nitro__fastio__HybridInputStreamSpec_ in
          let __cxxWrapped = __unwrappedValue.getCxxWrapper()
          return __cxxWrapped.getCxxPart()
        }())
      } else {
        return .init()
      }
    }())
  }

  var url: String {
    @inline(__always)
    get {
      return String(self.__url)
    }
    @inline(__always)
    set {
      self.__url = std.string(newValue)
    }
  }
  
  var method: RequestMethod {
    @inline(__always)
    get {
      return self.__method
    }
    @inline(__always)
    set {
      self.__method = newValue
    }
  }
  
  var body: (any HybridInputStreamSpec)? {
    @inline(__always)
    get {
      return { () -> (any HybridInputStreamSpec)? in
        if let __unwrapped = self.__body.value {
          return { () -> HybridInputStreamSpec in
            let __unsafePointer = bridge.get_std__shared_ptr_margelo__nitro__fastio__HybridInputStreamSpec_(__unwrapped)
            let __instance = HybridInputStreamSpec_cxx.fromUnsafe(__unsafePointer)
            return __instance.getHybridInputStreamSpec()
          }()
        } else {
          return nil
        }
      }()
    }
    @inline(__always)
    set {
      self.__body = { () -> bridge.std__optional_std__shared_ptr_margelo__nitro__fastio__HybridInputStreamSpec__ in
        if let __unwrappedValue = newValue {
          return bridge.create_std__optional_std__shared_ptr_margelo__nitro__fastio__HybridInputStreamSpec__({ () -> bridge.std__shared_ptr_margelo__nitro__fastio__HybridInputStreamSpec_ in
            let __cxxWrapped = __unwrappedValue.getCxxWrapper()
            return __cxxWrapped.getCxxPart()
          }())
        } else {
          return .init()
        }
      }()
    }
  }
}
