in src/Cli/func/Actions/LocalActions/CreateFunctionAction.cs [280:336]
public async Task UpdateLanguageAndRuntime()
{
_workerRuntime = GlobalCoreToolsSettings.CurrentWorkerRuntimeOrNone;
if (!CurrentPathHasLocalSettings())
{
// we're assuming "func init" has not been run
await _initAction.RunAsync();
_workerRuntime = _initAction.ResolvedWorkerRuntime;
Language = _initAction.ResolvedLanguage;
}
if (_workerRuntime != WorkerRuntime.None && !string.IsNullOrWhiteSpace(Language))
{
// validate
var workerRuntimeSelected = WorkerRuntimeLanguageHelper.NormalizeWorkerRuntime(Language);
if (_workerRuntime != workerRuntimeSelected)
{
throw new CliException("Selected language doesn't match worker set in local.settings.json." +
$"Selected worker is: {_workerRuntime} and selected language is: {workerRuntimeSelected}");
}
}
else if (string.IsNullOrWhiteSpace(Language))
{
if (_workerRuntime == WorkerRuntime.None)
{
SelectionMenuHelper.DisplaySelectionWizardPrompt("language");
Language = SelectionMenuHelper.DisplaySelectionWizard(_templates.Value.Select(t => t.Metadata.Language).Where(l => !l.Equals("python", StringComparison.OrdinalIgnoreCase)).Distinct());
_workerRuntime = WorkerRuntimeLanguageHelper.SetWorkerRuntime(_secretsManager, Language);
}
else if (!WorkerRuntimeLanguageHelper.IsDotnet(_workerRuntime) || Csx)
{
var languages = WorkerRuntimeLanguageHelper.LanguagesForWorker(_workerRuntime);
var displayList = _templates.Value
.Select(t => t.Metadata.Language)
.Where(l => languages.Contains(l, StringComparer.OrdinalIgnoreCase))
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToArray();
if (displayList.Length == 1)
{
Language = displayList.First();
}
else if (!InferAndUpdateLanguage(_workerRuntime))
{
SelectionMenuHelper.DisplaySelectionWizardPrompt("language");
Language = SelectionMenuHelper.DisplaySelectionWizard(displayList);
}
}
else if (WorkerRuntimeLanguageHelper.IsDotnet(_workerRuntime))
{
InferAndUpdateLanguage(_workerRuntime);
}
}
else if (!string.IsNullOrWhiteSpace(Language))
{
_workerRuntime = WorkerRuntimeLanguageHelper.SetWorkerRuntime(_secretsManager, Language);
}
}