diff --git a/Sources/Configuration/Providers/CLI/CLIArgumentParser.swift b/Sources/Configuration/Providers/CLI/CLIArgumentParser.swift index 3a2a38c..fa781f8 100644 --- a/Sources/Configuration/Providers/CLI/CLIArgumentParser.swift +++ b/Sources/Configuration/Providers/CLI/CLIArgumentParser.swift @@ -122,7 +122,7 @@ internal struct CLIArgumentParser { if value.isEmpty { return [""] } - return value.components(separatedBy: ",") + return value.split(separator: ",", omittingEmptySubsequences: false).map(String.init) } } } diff --git a/Sources/Configuration/Providers/EnvironmentVariables/EnvironmentVariablesProvider.swift b/Sources/Configuration/Providers/EnvironmentVariables/EnvironmentVariablesProvider.swift index 38e1f47..60a261b 100644 --- a/Sources/Configuration/Providers/EnvironmentVariables/EnvironmentVariablesProvider.swift +++ b/Sources/Configuration/Providers/EnvironmentVariables/EnvironmentVariablesProvider.swift @@ -345,7 +345,7 @@ internal struct EnvironmentValueArrayDecoder { /// - Parameter string: The source string to parse. /// - Returns: The parsed array. func decode(_ string: String) -> [String] { - string.split(separator: separator).map { $0.trimmed() } + string.split(separator: separator, omittingEmptySubsequences: false).map { $0.trimmed() } } } diff --git a/Tests/ConfigurationTests/EnvironmentVariablesProviderTests.swift b/Tests/ConfigurationTests/EnvironmentVariablesProviderTests.swift index 030dd45..af6228e 100644 --- a/Tests/ConfigurationTests/EnvironmentVariablesProviderTests.swift +++ b/Tests/ConfigurationTests/EnvironmentVariablesProviderTests.swift @@ -99,11 +99,12 @@ struct EnvironmentVariablesProviderTests { "BOOL_NO": "NO", "BOOL_THROWS_ERROR_EMPTY": "", "BOOL_THROWS_ERROR_NOT_BOOL_STRING": "2", - "BOOLY_ARRAY_TRUE": "true,1,,YES", + "BOOLY_ARRAY_TRUE": "true,1,YES", "BOOLY_ARRAY_FALSE": "false,0,NO", "BOOLY_ARRAY_THROWS_1": "true,1,YESS", "BOOLY_ARRAY_THROWS_2": "false,00,no", - "BOOLY_ARRAY_THROWS_3": "false, ,no", + "BOOLY_ARRAY_THROWS_3": " ,", + "BOOLY_ARRAY_THROWS_4": ",", ]) #expect(try sut.value(forKey: "BOOL_TRUE", type: .bool).value == true) #expect(try sut.value(forKey: "BOOL_FALSE", type: .bool).value == false) @@ -124,6 +125,54 @@ struct EnvironmentVariablesProviderTests { #expect(throws: ConfigError.self) { try sut.value(forKey: "BOOLY_ARRAY_THROWS_1", type: .boolArray) } #expect(throws: ConfigError.self) { try sut.value(forKey: "BOOLY_ARRAY_THROWS_2", type: .boolArray) } #expect(throws: ConfigError.self) { try sut.value(forKey: "BOOLY_ARRAY_THROWS_3", type: .boolArray) } + #expect(throws: ConfigError.self) { try sut.value(forKey: "BOOLY_ARRAY_THROWS_4", type: .boolArray) } + } + + @available(Configuration 1.0, *) + @Test func valueForKeyOfIntArrayTypes() throws { + let sut = EnvironmentVariablesProvider( + environmentVariables: [ + "INTLY_ARRAY_1": "-1,0,1", + "INTLY_ARRAY_2": " -1 , 0 ,1", + "INTLY_ARRAY_THROWS_1": "", + "INTLY_ARRAY_THROWS_2": " ", + "INTLY_ARRAY_THROWS_3": ",", + "INTLY_ARRAY_THROWS_4": " ,", + "INTLY_ARRAY_THROWS_5": "1,,2", + "INTLY_ARRAY_THROWS_6": "1, ,2", + ]) + #expect(try sut.value(forKey: "INTLY_ARRAY_1", type: .intArray).value == .init([-1, 0, 1], isSecret: false)) + #expect(try sut.value(forKey: "INTLY_ARRAY_2", type: .intArray).value == .init([-1, 0, 1], isSecret: false)) + #expect(throws: ConfigError.self) { try sut.value(forKey: "INTLY_ARRAY_THROWS_1", type: .intArray) } + #expect(throws: ConfigError.self) { try sut.value(forKey: "INTLY_ARRAY_THROWS_2", type: .intArray) } + #expect(throws: ConfigError.self) { try sut.value(forKey: "INTLY_ARRAY_THROWS_3", type: .intArray) } + #expect(throws: ConfigError.self) { try sut.value(forKey: "INTLY_ARRAY_THROWS_4", type: .intArray) } + #expect(throws: ConfigError.self) { try sut.value(forKey: "INTLY_ARRAY_THROWS_5", type: .intArray) } + #expect(throws: ConfigError.self) { try sut.value(forKey: "INTLY_ARRAY_THROWS_6", type: .intArray) } + } + + @available(Configuration 1.0, *) + @Test func valueForKeyOfDoubleArrayTypes() throws { + let sut = EnvironmentVariablesProvider( + environmentVariables: [ + "DOUBLY_ARRAY_1": "-1.1,0,1.1", + "DOUBLY_ARRAY_2": " -1.1 , 0 ,1.1", + "DOUBLY_ARRAY_THROWS_1": "", + "DOUBLY_ARRAY_THROWS_2": " ", + "DOUBLY_ARRAY_THROWS_3": ",", + "DOUBLY_ARRAY_THROWS_4": " ,", + "DOUBLY_ARRAY_THROWS_5": "1.1,,2.1", + "DOUBLY_ARRAY_THROWS_6": "1.1, ,2.1", + ]) + #expect(try sut.value(forKey: "DOUBLY_ARRAY_1", type: .doubleArray).value == .init([-1.1, 0, 1.1], isSecret: false)) + #expect(try sut.value(forKey: "DOUBLY_ARRAY_2", type: .doubleArray).value == .init([-1.1, 0, 1.1], isSecret: false)) + #expect(throws: ConfigError.self) { try sut.value(forKey: "DOUBLY_ARRAY_THROWS_1", type: .doubleArray) } + #expect(throws: ConfigError.self) { try sut.value(forKey: "DOUBLY_ARRAY_THROWS_1", type: .doubleArray) } + #expect(throws: ConfigError.self) { try sut.value(forKey: "DOUBLY_ARRAY_THROWS_2", type: .doubleArray) } + #expect(throws: ConfigError.self) { try sut.value(forKey: "DOUBLY_ARRAY_THROWS_3", type: .doubleArray) } + #expect(throws: ConfigError.self) { try sut.value(forKey: "DOUBLY_ARRAY_THROWS_4", type: .doubleArray) } + #expect(throws: ConfigError.self) { try sut.value(forKey: "DOUBLY_ARRAY_THROWS_5", type: .doubleArray) } + #expect(throws: ConfigError.self) { try sut.value(forKey: "DOUBLY_ARRAY_THROWS_6", type: .doubleArray) } } @available(Configuration 1.0, *)