[ https://issues.apache.org/jira/browse/MINIFICPP-1329?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Adam Hunyadi updated MINIFICPP-1329: ------------------------------------ Description: *Background:* Conversions from string to other values in MiNiFi usually follow the convention of changing an output value and returning a boolean denoting the success of the conversion. For booleans however, this is not the case: {code:c++|title=Current Implementation} bool StringUtils::StringToBool(std::string input, bool &output) { std::transform(input.begin(), input.end(), input.begin(), ::tolower); std::istringstream(input) >> std::boolalpha >> output; return output; } {code} It is known to be misused in the code, for example this code assumes the return value false corresponds to a parse failure: [https://github.com/apache/nifi-minifi-cpp/blob/rel/minifi-cpp-0.7.0/extensions/opc/src/putopc.cpp#L319-L323] *Proposal:* If we want to stay consistent with the other conversions, we can do this: {code:c++|title=Minimum change for the new implementation} bool StringUtils::StringToBool(std::string input, bool &output) { std::transform(input.begin(), input.end(), input.begin(), ::tolower); output = "true" == input; return output || "false" == input; } {code} However, many cases use the return value as the conversion result. One should be cautious: # Introduce the new implementation next to the old one as a function with a different name # Change the return value to void on the original # Until the code compiles: ## Eliminate all the usages of return values as parsed values ## Redirect the checked value implementations to the copy # Change the implementation of the original to return the conversion success # Delete the copy # Search and replace the name of the copy to the original (i) With a bit more work, we can potentially change the return type to an optional, or a success enum. was: *Background:* Conversions from string to other values in MINIFI usually follow the convention of changing an output value and returning a boolean denoting the success of the conversion. For booleans however, this is not the case: {code:c++|title=Current Implementation} bool StringUtils::StringToBool(std::string input, bool &output) { std::transform(input.begin(), input.end(), input.begin(), ::tolower); std::istringstream(input) >> std::boolalpha >> output; return output; } {code} It is known to be misused in the code, for example this code assumes the return value false corresponds to a parse failure: [https://github.com/apache/nifi-minifi-cpp/blob/rel/minifi-cpp-0.7.0/extensions/opc/src/putopc.cpp#L319-L323] *Proposal:* If we want to stay consistent with the other conversions, we can do this: {code:c++|title=Minimum change for the new implementation} bool StringUtils::StringToBool(std::string input, bool &output) { std::transform(input.begin(), input.end(), input.begin(), ::tolower); output = "true" == input; return output || "false" == input; } {code} However, many cases use the return value as the conversion result. One should be cautious: # First we should copy the implementation to one with a different name # Change the return value to void on the original # Until the code compiles: ## Eliminate all the usages of return values as parsed values ## Redirect the checked value implementations to the copy # Change the implementation of the original to return the conversion success # Delete the copy # Search and replace the name of the copy to the original (your IDE can do this, but verify the result) (i) With a bit more work, we can potentially change the return type to an optional, or a success enum. > Fix implementation and usages of StringUtils::StringToBool > ---------------------------------------------------------- > > Key: MINIFICPP-1329 > URL: https://issues.apache.org/jira/browse/MINIFICPP-1329 > Project: Apache NiFi MiNiFi C++ > Issue Type: Bug > Reporter: Adam Hunyadi > Priority: Minor > Labels: MiNiFi-CPP-Hygiene, beginner, newbie, starter > > *Background:* > Conversions from string to other values in MiNiFi usually follow the > convention of changing an output value and returning a boolean denoting the > success of the conversion. For booleans however, this is not the case: > {code:c++|title=Current Implementation} > bool StringUtils::StringToBool(std::string input, bool &output) { > std::transform(input.begin(), input.end(), input.begin(), ::tolower); > std::istringstream(input) >> std::boolalpha >> output; > return output; > } > {code} > It is known to be misused in the code, for example this code assumes the > return value false corresponds to a parse failure: > > [https://github.com/apache/nifi-minifi-cpp/blob/rel/minifi-cpp-0.7.0/extensions/opc/src/putopc.cpp#L319-L323] > *Proposal:* > If we want to stay consistent with the other conversions, we can do this: > {code:c++|title=Minimum change for the new implementation} > bool StringUtils::StringToBool(std::string input, bool &output) { > std::transform(input.begin(), input.end(), input.begin(), ::tolower); > output = "true" == input; > return output || "false" == input; > } > {code} > However, many cases use the return value as the conversion result. One should > be cautious: > # Introduce the new implementation next to the old one as a function with a > different name > # Change the return value to void on the original > # Until the code compiles: > ## Eliminate all the usages of return values as parsed values > ## Redirect the checked value implementations to the copy > # Change the implementation of the original to return the conversion success > # Delete the copy > # Search and replace the name of the copy to the original > (i) With a bit more work, we can potentially change the return type to an > optional, or a success enum. -- This message was sent by Atlassian Jira (v8.3.4#803005)