/// <summary>
 /// Current status of this instance.
 /// We specifically infer the status from the other fields rather than explicitly include status
 /// so that we don't duplicate state.
 /// </summary>
 public static FunctionInstanceStatus GetStatus(this IFunctionInstanceBaseEntry item)
 {
     if (item.IsCompleted())
     {
         if (item.IsSucceeded())
         {
             return(FunctionInstanceStatus.CompletedSuccess);
         }
         else
         {
             return(FunctionInstanceStatus.CompletedFailure);
         }
     }
     else
     {
         if (item.FunctionInstanceHeartbeatExpiry.HasValue)
         {
             var  now       = DateTime.UtcNow;
             bool isExpired = item.FunctionInstanceHeartbeatExpiry.Value < now;
             if (isExpired)
             {
                 return(FunctionInstanceStatus.Abandoned);
             }
         }
         return(FunctionInstanceStatus.Running);
     }
 }
 /// <summary>true if this function succeeded.</summary>
 public static bool IsSucceeded(this IFunctionInstanceBaseEntry item)
 {
     if (item == null)
     {
         throw new ArgumentNullException("item");
     }
     return(item.Status == FunctionInstanceStatus.CompletedSuccess);
 }
 /// <summary>
 /// true if this function has completed (either success or failure)
 /// </summary>
 public static bool IsCompleted(this IFunctionInstanceBaseEntry item)
 {
     if (item == null)
     {
         throw new ArgumentNullException("item");
     }
     return(item.EndTime.HasValue);
 }
 /// <summary>true if this function succeeded.</summary>
 public static bool IsSucceeded(this IFunctionInstanceBaseEntry item)
 {
     if (item == null)
     {
         throw new ArgumentNullException("item");
     }
     return(item.IsCompleted() && !item.HasError);
 }