private FunctionMetadata ParseFunctionMetadata(string functionName, JObject configMetadata, string scriptDirectory, IFileSystem fileSystem, IEnumerable <RpcWorkerConfig> workerConfigs) { var functionMetadata = new FunctionMetadata { Name = functionName, FunctionDirectory = scriptDirectory }; JArray bindingArray = (JArray)configMetadata["bindings"]; if (bindingArray == null || bindingArray.Count == 0) { throw new FormatException("At least one binding must be declared."); } if (bindingArray != null) { foreach (JObject binding in bindingArray) { BindingMetadata bindingMetadata = BindingMetadata.Create(binding); functionMetadata.Bindings.Add(bindingMetadata); } } JToken isDirect; if (configMetadata.TryGetValue("configurationSource", StringComparison.OrdinalIgnoreCase, out isDirect)) { var isDirectValue = isDirect.ToString(); if (string.Equals(isDirectValue, "attributes", StringComparison.OrdinalIgnoreCase)) { functionMetadata.SetIsDirect(true); } else if (!string.Equals(isDirectValue, "config", StringComparison.OrdinalIgnoreCase)) { throw new FormatException($"Illegal value '{isDirectValue}' for 'configurationSource' property in {functionMetadata.Name}'."); } } functionMetadata.ScriptFile = DeterminePrimaryScriptFile((string)configMetadata["scriptFile"], scriptDirectory, fileSystem); if (!string.IsNullOrWhiteSpace(functionMetadata.ScriptFile)) { functionMetadata.Language = ParseLanguage(functionMetadata.ScriptFile, workerConfigs); } functionMetadata.EntryPoint = (string)configMetadata["entryPoint"]; //Retry functionMetadata.Retry = configMetadata.Property(ConfigurationSectionNames.Retry)?.Value?.ToObject <RetryOptions>(); Utility.ValidateRetryOptions(functionMetadata.Retry); return(functionMetadata); }