/// <summary> /// Start listening for CloudEvents and handle them using the specified callback function. /// <para> /// The <typeparamref name="TCloudEvent"/> type <em>must</em> define a constructor with the /// exact parameters <c>(<see cref="IReceiverMessage"/>, <see cref="IProtocolBinding"/>) /// </c>. A <see cref="MissingMemberException"/> is immediately thrown if the class does /// not define such a constructor. /// </para> /// </summary> /// <param name="receiver">The receiver to start.</param> /// <param name="onEventReceivedAsync"> /// A function that is invoked when a CloudEvent is received. /// </param> /// <param name="protocolBinding"> /// The <see cref="IProtocolBinding"/> used to map <see cref="IReceiverMessage"/> headers to /// CloudEvent attributes. /// </param> /// <exception cref="ArgumentNullException"> /// If <paramref name="receiver"/> or <paramref name="onEventReceivedAsync"/> is <see /// langword="null"/>. /// </exception> /// <exception cref="MissingMemberException"> /// If the <typeparamref name="TCloudEvent"/> class does not define a public constructor /// with the exact parameters <c>(<see cref="IReceiverMessage"/>, <see cref= /// "IProtocolBinding"/>)</c>. /// </exception> public static void Start <TCloudEvent>(this IReceiver receiver, Func <TCloudEvent, IReceiverMessage, Task> onEventReceivedAsync, IProtocolBinding protocolBinding = null) where TCloudEvent : CloudEvent { if (receiver is null) { throw new ArgumentNullException(nameof(receiver)); } if (onEventReceivedAsync is null) { throw new ArgumentNullException(nameof(onEventReceivedAsync)); } if (!MessageConstructor.Exists(typeof(TCloudEvent))) { throw MissingReceiverConstructor(typeof(TCloudEvent)); } receiver.Start(message => onEventReceivedAsync(message.To <TCloudEvent>(protocolBinding), message)); }