diff --git a/Engine/Settings.cs b/Engine/Settings.cs index 35a941781..40e4043ea 100644 --- a/Engine/Settings.cs +++ b/Engine/Settings.cs @@ -690,40 +690,42 @@ internal static SettingsMode FindSettingsMode(object settings, string path, out } else { - var settingsFilePath = settingsFound as String; - if (settingsFilePath != null) - { - if (IsBuiltinSettingPreset(settingsFilePath)) - { - settingsMode = SettingsMode.Preset; - settingsFound = GetSettingPresetFilePath(settingsFilePath); - } - else - { - settingsMode = SettingsMode.File; - settingsFound = settingsFilePath; - } - } - else + if (!TryResolveSettingForStringType(settingsFound, ref settingsMode, ref settingsFound)) { if (settingsFound is Hashtable) { settingsMode = SettingsMode.Hashtable; } - else // if the provided argument is wrapped in an expressions then PowerShell resolves it but it will be of type PSObject and we have to operate then on the BaseObject + // if the provided argument is wrapped in an expressions then PowerShell resolves it but it will be of type PSObject and we have to operate then on the BaseObject + else if (settingsFound is PSObject settingsFoundPSObject) { - if (settingsFound is PSObject settingsFoundPSObject) - { - if (settingsFoundPSObject.BaseObject is String) - { - settingsMode = SettingsMode.File; - } - } + TryResolveSettingForStringType(settingsFoundPSObject.BaseObject, ref settingsMode, ref settingsFound); } } } return settingsMode; } + + // If the settings object is a string determine wheter it is one of the settings preset or a file path and resolve the setting in the former case. + private static bool TryResolveSettingForStringType(object settingsObject, ref SettingsMode settingsMode, ref object resolvedSettingValue) + { + if (settingsObject is string settingsString) + { + if (IsBuiltinSettingPreset(settingsString)) + { + settingsMode = SettingsMode.Preset; + resolvedSettingValue = GetSettingPresetFilePath(settingsString); + } + else + { + settingsMode = SettingsMode.File; + resolvedSettingValue = settingsString; + } + return true; + } + + return false; + } } } diff --git a/Tests/Engine/InvokeScriptAnalyzer.tests.ps1 b/Tests/Engine/InvokeScriptAnalyzer.tests.ps1 index fc149b95c..09f39243c 100644 --- a/Tests/Engine/InvokeScriptAnalyzer.tests.ps1 +++ b/Tests/Engine/InvokeScriptAnalyzer.tests.ps1 @@ -406,6 +406,13 @@ Describe "Test CustomizedRulePath" { Pop-Location } } + + It "resolves rule preset when passed in via pipeline" { + $warnings = 'CodeFormattingStroustrup' | ForEach-Object { + Invoke-ScriptAnalyzer -ScriptDefinition 'if ($true){}' -Settings $_} + $warnings.Count | Should -Be 1 + $warnings.RuleName | Should -Be 'PSUseConsistentWhitespace' + } It "Should use the CustomRulePath parameter" { $settings = @{