private LoadResult MapToLoadResult([NotNull] RazorTemplateLoadResult razorTemplateLoadResult)
        {
            if (razorTemplateLoadResult == null)
            {
                throw new ArgumentNullException(nameof(razorTemplateLoadResult));
            }

            var detail = string.Join("\n", razorTemplateLoadResult.Errors ?? new string[0]);

            Error loadError;

            switch (razorTemplateLoadResult.Status)
            {
            case RazorTemplateLoadResult.LoadResultStatus.Success:
                return(LoadResult.CreateSuccessResult());

            case RazorTemplateLoadResult.LoadResultStatus.CodeCompilationFailed:
                loadError = new RazorTemplateError(RazorTemplateErrorCodes.CodeCompilationError, detail);
                break;

            case RazorTemplateLoadResult.LoadResultStatus.CodeGenerationFailed:
                loadError = new RazorTemplateError(RazorTemplateErrorCodes.CodeGenerationError, detail);
                break;

            default:
                loadError = new RazorTemplateError(RazorTemplateErrorCodes.GeneralRazorTemplateError, detail);
                break;
            }

            return(LoadResult.CreateFailResult(loadError));
        }
        public LoadResult Load(Stream templateStream)
        {
            if (templateStream == null)
            {
                throw new ArgumentNullException(nameof(templateStream));
            }

            if (!templateStream.CanRead || !templateStream.CanSeek)
            {
                throw new ArgumentException("The supplied stream must be readable and seekable", nameof(templateStream));
            }

            if (_loadCalled)
            {
                throw new InvalidOperationException("Cannot call Load more than once");
            }

            _loadCalled = true;

            _razorEngineRendererHost = new AppDomainIsolatedHost <RazorEngineRenderer>();

            _encoding = TextEncodingDetector.GetEncoding(templateStream);

            using (var reader = new StreamReader(templateStream))
            {
                _loadedTemplate = reader.ReadToEnd();
            }

            RazorTemplateLoadResult razorTemplateLoadResult;

            try
            {
                _razorEngineRenderer    = _razorEngineRendererHost.CreateHostedInstance();
                razorTemplateLoadResult = _razorEngineRenderer.LoadTemplate(_loadedTemplate);
            }
            catch (TemplateParsingException ex)
            {
                razorTemplateLoadResult = new RazorTemplateLoadResult(
                    RazorTemplateLoadResult.LoadResultStatus.CodeGenerationFailed,
                    new[] { $"Code Generation Error: {ex.Message} (at line {ex.Line}, column {ex.Column}" });
            }
            catch (TemplateCompilationException ex)
            {
                razorTemplateLoadResult = new RazorTemplateLoadResult(
                    RazorTemplateLoadResult.LoadResultStatus.CodeCompilationFailed,
                    ex.CompilerErrors.Select(e => $"Code Compilation Error: {e.ErrorNumber}: {e.ErrorText} (at line {e.Line}, column {e.Column})").ToArray());
            }
            catch (Exception ex)
            {
                razorTemplateLoadResult = new RazorTemplateLoadResult(
                    RazorTemplateLoadResult.LoadResultStatus.CodeCompilationFailed,
                    new [] { $"Exception while compiling template: {ex}" });
            }

            return(MapToLoadResult(razorTemplateLoadResult));
        }