| 75 | // Yanked from the implementation `google::protobuf::util::TimeUtil`. |
| 76 | template <typename Chars> |
| 77 | absl::Status SnakeCaseToCamelCaseImpl(Chars input, |
| 78 | std::string* absl_nonnull output) { |
| 79 | output->clear(); |
| 80 | bool after_underscore = false; |
| 81 | for (char input_char : input) { |
| 82 | if (absl::ascii_isupper(input_char)) { |
| 83 | // The field name must not contain uppercase letters. |
| 84 | return absl::InvalidArgumentError( |
| 85 | "field mask path name contains uppercase letters"); |
| 86 | } |
| 87 | if (after_underscore) { |
| 88 | if (absl::ascii_islower(input_char)) { |
| 89 | output->push_back(absl::ascii_toupper(input_char)); |
| 90 | after_underscore = false; |
| 91 | } else { |
| 92 | // The character after a "_" must be a lowercase letter. |
| 93 | return absl::InvalidArgumentError( |
| 94 | "field mask path contains '_' not followed by a lowercase letter"); |
| 95 | } |
| 96 | } else if (input_char == '_') { |
| 97 | after_underscore = true; |
| 98 | } else { |
| 99 | output->push_back(input_char); |
| 100 | } |
| 101 | } |
| 102 | if (after_underscore) { |
| 103 | // Trailing "_". |
| 104 | return absl::InvalidArgumentError("field mask path contains trailing '_'"); |
| 105 | } |
| 106 | return absl::OkStatus(); |
| 107 | } |
| 108 | |
| 109 | absl::Status SnakeCaseToCamelCase(const well_known_types::StringValue& input, |
| 110 | std::string* absl_nonnull output) { |
no test coverage detected