/// <summary>
        /// The repository is a folder, and these are in time-order, so the smallest is oldest,
        /// which is the one we want (FIFO). This will grabe this and deserialize it.
        /// </summary>
        /// <param name="queueLocation"></param>
        /// <param name="explanation"></param>
        /// <returns></returns>
        public static bool PutRequest(string queueLocation, SimEngineRequest request, out string explanation)
        {
            explanation = "";
            try
            {
                if (!Directory.Exists(queueLocation))
                {
                    explanation = $"Path={queueLocation} does not exist.";
                    return(false);
                }
                if (request == null)
                {
                    explanation = $"request cannot be null.";
                    return(false);
                }

                string path = BuildRequestPath(queueLocation, request);

                if (!JsonHelpers.SerializeToFile <SimEngineRequest>(path, request, false, out explanation))
                {
                    return(false);
                }

                return(true);
            }
            catch (Exception ex)
            {
                explanation = $"Location={queueLocation}. Err={ex.Message}";
                return(false);
            }
        }
        /// <summary>
        /// Build a legitimate file path using the current time (DateTimeOffset)
        /// and the Project name, with a .json extension.
        /// This guarantess that the default ordering from GetFiles will have
        /// the oldest files first.
        /// Example: 2020-11-29 13-58-34-3922-DiscretPartsProduction.json
        /// </summary>
        /// <param name="queueLocation"></param>
        /// <param name="request"></param>
        /// <returns></returns>
        public static string BuildRequestPath(string queueLocation, SimEngineRequest request)
        {
            string timestamp = DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm.ss.ffff")
                               .Replace(":", "-")
                               .Replace(".", "-");
            string projectName = Path.GetFileNameWithoutExtension(request.ProjectFilename);

            string fullpath = Path.Combine(queueLocation, $"{timestamp}-{projectName}.json");

            return(fullpath);
        }
        /// <summary>
        /// The request repository is a folder, and the files within are in time-order, so the smallest is oldest,
        /// which is the one we want (FIFO). This will grabe this and deserialize it.
        /// </summary>
        /// <param name="queueLocation"></param>
        /// <param name="explanation"></param>
        /// <returns></returns>
        public static SimEngineRequest GetNextRequest(string queueLocation, out string explanation)
        {
            explanation = "";
            string           marker  = "Begin.";
            SimEngineRequest request = null;

            try
            {
                marker = $"Getting files from {queueLocation}";
                List <string> fileList = Directory.GetFiles(queueLocation, "*.json").ToList();
                if (!fileList.Any())
                {
                    return(null);
                }

                string path = fileList.First();

                // try 5 times... to handle the rare conflicts between producer and consumer.
                int attempts = 0;

                while (attempts < 5)
                {
                    marker = $"Deserializing from={path}. Attempts={attempts}";
                    if (!JsonHelpers.DeserializeFromFile <SimEngineRequest>(path, out request, out explanation))
                    {
                        if (++attempts >= 5)
                        {
                            return(null);
                        }
                        System.Threading.Thread.Sleep(100);
                    }
                    else
                    {
                        request.RequestPath = path;
                        marker = $"Set RequestPath to={request.RequestPath}";

                        goto DoneWithAttempts;
                    }
                } // while not successful

DoneWithAttempts:
                return(request);
            }
            catch (Exception ex)
            {
                explanation = $"Location={queueLocation}. Marker={marker}. Err={ex.Message}";
                return(null);
            }
        }