private bool ValidateAndExtractDownloadData( FrontEndContext context, IDownloadFileSettings downloadSettings, Dictionary <string, DownloadData> downloads, AbsolutePath resolverFolder, out DownloadData downloadData) { downloadData = null; if (string.IsNullOrEmpty(downloadSettings.ModuleName)) { Logger.Log.DownloadFrontendMissingModuleId(m_context.LoggingContext, downloadSettings.Url); return(false); } if (downloads.ContainsKey(downloadSettings.ModuleName)) { Logger.Log.DownloadFrontendDuplicateModuleId(m_context.LoggingContext, downloadSettings.ModuleName, Kind, Name); return(false); } if (string.IsNullOrEmpty(downloadSettings.Url)) { Logger.Log.DownloadFrontendMissingUrl(m_context.LoggingContext, downloadSettings.ModuleName); return(false); } if (!Uri.TryCreate(downloadSettings.Url, UriKind.Absolute, out var downloadLocation)) { Logger.Log.DownloadFrontendInvalidUrl(m_context.LoggingContext, downloadSettings.ModuleName, downloadSettings.Url); return(false); } ContentHash?contentHash; if (string.IsNullOrEmpty(downloadSettings.Hash)) { contentHash = null; } else { if (!ContentHash.TryParse(downloadSettings.Hash, out var hash)) { Logger.Log.DownloadFrontendHashValueNotValidContentHash(m_context.LoggingContext, downloadSettings.ModuleName, downloadSettings.Url, downloadSettings.Hash); return(false); } contentHash = hash; } // For these last two validations, the TS parser would also complain, but we just give a more targeted error before that happens. if (!string.IsNullOrEmpty(downloadSettings.DownloadedValueName) && !SymbolAtom.TryCreate(context.StringTable, downloadSettings.DownloadedValueName, out _)) { Logger.Log.NameContainsInvalidCharacters(m_context.LoggingContext, "downloadedValueName", downloadSettings.DownloadedValueName); return(false); } if (!string.IsNullOrEmpty(downloadSettings.ExtractedValueName) && !SymbolAtom.TryCreate(context.StringTable, downloadSettings.ExtractedValueName, out _)) { Logger.Log.NameContainsInvalidCharacters(m_context.LoggingContext, "extractedValueName", downloadSettings.ExtractedValueName); return(false); } downloadData = new DownloadData(context, downloadSettings, downloadLocation, resolverFolder, contentHash, downloadSettings.DownloadedValueName, downloadSettings.ExtractedValueName); return(true); }