///
/// ToolDefinition.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 `ToolDefinition`, backed by a C++ struct.
 */
public typealias ToolDefinition = margelo.nitro.mlxreactnative.ToolDefinition

public extension ToolDefinition {
  private typealias bridge = margelo.nitro.mlxreactnative.bridge.swift

  /**
   * Create a new instance of `ToolDefinition`.
   */
  init(name: String, description: String, parameters: [ToolParameter], handler: @escaping (_ args: AnyMap) -> Promise<Promise<AnyMap>>) {
    self.init(std.string(name), std.string(description), { () -> bridge.std__vector_ToolParameter_ in
      var __vector = bridge.create_std__vector_ToolParameter_(parameters.count)
      for __item in parameters {
        __vector.push_back(__item)
      }
      return __vector
    }(), { () -> bridge.Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap______std__shared_ptr_AnyMap_ in
      let __closureWrapper = Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap______std__shared_ptr_AnyMap_(handler)
      return bridge.create_Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap______std__shared_ptr_AnyMap_(__closureWrapper.toUnsafe())
    }())
  }

  @inline(__always)
  var name: String {
    return String(self.__name)
  }
  
  @inline(__always)
  var description: String {
    return String(self.__description)
  }
  
  @inline(__always)
  var parameters: [ToolParameter] {
    return self.__parameters.map({ __item in __item })
  }
  
  @inline(__always)
  var handler: (_ args: AnyMap) -> Promise<Promise<AnyMap>> {
    return { () -> (AnyMap) -> Promise<Promise<AnyMap>> in
      let __wrappedFunction = bridge.wrap_Func_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap______std__shared_ptr_AnyMap_(self.__handler)
      return { (__args: AnyMap) -> Promise<Promise<AnyMap>> in
        let __result = __wrappedFunction.call(__args.cppPart)
        return { () -> Promise<Promise<AnyMap>> in
          let __promise = Promise<Promise<AnyMap>>()
          let __resolver = { (__result: Promise<AnyMap>) in
            __promise.resolve(withResult: __result)
          }
          let __rejecter = { (__error: Error) in
            __promise.reject(withError: __error)
          }
          let __resolverCpp = { () -> bridge.Func_void_std__shared_ptr_Promise_std__shared_ptr_AnyMap___ in
            let __closureWrapper = Func_void_std__shared_ptr_Promise_std__shared_ptr_AnyMap___(__resolver)
            return bridge.create_Func_void_std__shared_ptr_Promise_std__shared_ptr_AnyMap___(__closureWrapper.toUnsafe())
          }()
          let __rejecterCpp = { () -> bridge.Func_void_std__exception_ptr in
            let __closureWrapper = Func_void_std__exception_ptr(__rejecter)
            return bridge.create_Func_void_std__exception_ptr(__closureWrapper.toUnsafe())
          }()
          let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_std__shared_ptr_Promise_std__shared_ptr_AnyMap_____(__result)
          __promiseHolder.addOnResolvedListener(__resolverCpp)
          __promiseHolder.addOnRejectedListener(__rejecterCpp)
          return __promise
        }()
      }
    }()
  }
}
