import Bindings

public struct ContactIdProvider {
  public var get: (Data) throws -> Data

  public func callAsFunction(contact: Data) throws -> Data {
    try get(contact)
  }
}

extension ContactIdProvider {
  public static let live = ContactIdProvider { contact in
    var error: NSError?
    let id = BindingsGetIDFromContact(contact, &error)
    if let error = error {
      throw error
    }
    guard let id = id else {
      fatalError("BindingsGetIDFromContact returned `nil` without providing error")
    }
    return id
  }
}

#if DEBUG
extension ContactIdProvider {
  public static let failing = ContactIdProvider { _ in
    struct NotImplemented: Error {}
    throw NotImplemented()
  }
}
#endif