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

import NitroModules

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

public extension NitroResponse {
  private typealias bridge = margelo.nitro.nitrofetch.bridge.swift

  /**
   * Create a new instance of `NitroResponse`.
   */
  init(url: String, status: Double, statusText: String, ok: Bool, redirected: Bool, headers: [NitroHeader], bodyString: String?, bodyBytes: ArrayBuffer?) {
    self.init(std.string(url), status, std.string(statusText), ok, redirected, { () -> bridge.std__vector_NitroHeader_ in
      var __vector = bridge.create_std__vector_NitroHeader_(headers.count)
      for __item in headers {
        __vector.push_back(__item)
      }
      return __vector
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = bodyString {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__shared_ptr_ArrayBuffer__ in
      if let __unwrappedValue = bodyBytes {
        return bridge.create_std__optional_std__shared_ptr_ArrayBuffer__(__unwrappedValue.getArrayBuffer())
      } else {
        return .init()
      }
    }())
  }

  @inline(__always)
  var url: String {
    return String(self.__url)
  }
  
  @inline(__always)
  var status: Double {
    return self.__status
  }
  
  @inline(__always)
  var statusText: String {
    return String(self.__statusText)
  }
  
  @inline(__always)
  var ok: Bool {
    return self.__ok
  }
  
  @inline(__always)
  var redirected: Bool {
    return self.__redirected
  }
  
  @inline(__always)
  var headers: [NitroHeader] {
    return { () -> [NitroHeader] in
                  var __array = [NitroHeader]()
                  let __count = self.__headers.size()
                  __array.reserveCapacity(Int(__count))
                  for __i in 0..<__count {
                    let __item = bridge.get_std__vector_NitroHeader_(self.__headers, __i)
                    __array.append(__item)
                  }
                  return __array
                }()
  }
  
  @inline(__always)
  var bodyString: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__bodyString) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__bodyString)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var bodyBytes: ArrayBuffer? {
    return { () -> ArrayBuffer? in
      if bridge.has_value_std__optional_std__shared_ptr_ArrayBuffer__(self.__bodyBytes) {
        let __unwrapped = bridge.get_std__optional_std__shared_ptr_ArrayBuffer__(self.__bodyBytes)
        return ArrayBuffer(__unwrapped)
      } else {
        return nil
      }
    }()
  }
}
