/// <summary>
 /// Convert a <see cref="Execution.Contracts.ExecutionContext"/> to <see cref="ExecutionContext"/>.
 /// </summary>
 /// <param name="executionContext"><see cref="Execution.Contracts.ExecutionContext"/> to convert from.</param>
 /// <returns>Converted <see cref="ExecutionContext"/>.</returns>
 public static ExecutionContext ToExecutionContext(this Execution.Contracts.ExecutionContext executionContext) =>
 new ExecutionContext(
     executionContext.MicroserviceId.To <Microservice>(),
     executionContext.TenantId.To <TenantId>(),
     executionContext.Version.ToVersion(),
     executionContext.Environment,
     executionContext.CorrelationId.To <CorrelationId>(),
     executionContext.Claims.ToClaims(),
     CultureInfo.InvariantCulture);
        /// <summary>
        /// Convert a <see cref="ExecutionContext"/> to <see cref="Execution.Contracts.ExecutionContext"/>.
        /// </summary>
        /// <param name="executionContext"><see cref="ExecutionContext"/> to convert from.</param>
        /// <returns>Converted <see cref="Execution.Contracts.ExecutionContext"/>.</returns>
        public static Execution.Contracts.ExecutionContext ToProtobuf(this ExecutionContext executionContext)
        {
            var message = new Execution.Contracts.ExecutionContext
            {
                MicroserviceId = executionContext.Microservice.ToProtobuf(),
                TenantId       = executionContext.Tenant.ToProtobuf(),
                CorrelationId  = executionContext.CorrelationId.ToProtobuf(),
                Environment    = executionContext.Environment,
                Version        = executionContext.Version.ToProtobuf()
            };

            message.Claims.AddRange(executionContext.Claims.ToProtobuf());

            return(message);
        }
        /// <summary>
        /// Set current execution context for a Protobuf <see cref="Execution.Contracts.ExecutionContext"/>.
        /// </summary>
        /// <param name="executionContextManager"><see cref="IExecutionContextManager"/> to extend.</param>
        /// <param name="executionContext"><see cref="Execution.Contracts.ExecutionContext"/> to set current.</param>
        public static void CurrentFor(this IExecutionContextManager executionContextManager, Execution.Contracts.ExecutionContext executionContext)
        {
            var microservice  = executionContext.MicroserviceId.To <Microservice>();
            var tenant        = executionContext.TenantId.To <TenantId>();
            var correlationId = executionContext.CorrelationId.To <CorrelationId>();
            var claims        = executionContext.Claims.ToClaims();

            executionContextManager.CurrentFor(
                microservice,
                tenant,
                correlationId,
                claims);
        }