diff options
author | thegeorg <[email protected]> | 2022-11-02 12:00:25 +0300 |
---|---|---|
committer | thegeorg <[email protected]> | 2022-11-02 12:00:25 +0300 |
commit | 56086cfd6edecd0aec84a9b19ebf508e65b79e9d (patch) | |
tree | b07862bc7090d55666c870cb063c3ce0f46b6f5b /contrib/libs/grpc/src/compiler/ruby_generator_string-inl.h | |
parent | e3ffb0af25c5c456263ecb50cd8d4cec27e37dc4 (diff) |
Cleanup unused grpc targets
* Merge grpc (core), grpc++ and gpr libraries into contrib/libs/grpc
* Drop unused grpc_unsecure, grpc++_unsecure and grpc++_error_details
* Remove abundance of hacks from import routine
Diffstat (limited to 'contrib/libs/grpc/src/compiler/ruby_generator_string-inl.h')
-rw-r--r-- | contrib/libs/grpc/src/compiler/ruby_generator_string-inl.h | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/contrib/libs/grpc/src/compiler/ruby_generator_string-inl.h b/contrib/libs/grpc/src/compiler/ruby_generator_string-inl.h new file mode 100644 index 00000000000..4859b756050 --- /dev/null +++ b/contrib/libs/grpc/src/compiler/ruby_generator_string-inl.h @@ -0,0 +1,149 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_INTERNAL_COMPILER_RUBY_GENERATOR_STRING_INL_H +#define GRPC_INTERNAL_COMPILER_RUBY_GENERATOR_STRING_INL_H + +#include <algorithm> +#include <sstream> +#include <vector> + +#include "src/compiler/config.h" + +using std::getline; +using std::transform; + +namespace grpc_ruby_generator { + +// Split splits a string using char into elems. +inline std::vector<TString>& Split(const TString& s, char delim, + std::vector<TString>* elems) { + std::stringstream ss(s); + std::string item; + while (getline(ss, item, delim)) { + elems->emplace_back(item); + } + return *elems; +} + +// Split splits a string using char, returning the result in a vector. +inline std::vector<TString> Split(const TString& s, char delim) { + std::vector<TString> elems; + Split(s, delim, &elems); + return elems; +} + +// Replace replaces from with to in s. +inline TString Replace(TString s, const TString& from, + const TString& to) { + size_t start_pos = s.find(from); + if (start_pos == TString::npos) { + return s; + } + s.replace(start_pos, from.length(), to); + return s; +} + +// ReplaceAll replaces all instances of search with replace in s. +inline TString ReplaceAll(TString s, const TString& search, + const TString& replace) { + size_t pos = 0; + while ((pos = s.find(search, pos)) != TString::npos) { + s.replace(pos, search.length(), replace); + pos += replace.length(); + } + return s; +} + +// ReplacePrefix replaces from with to in s if search is a prefix of s. +inline bool ReplacePrefix(TString* s, const TString& from, + const TString& to) { + size_t start_pos = s->find(from); + if (start_pos == TString::npos || start_pos != 0) { + return false; + } + s->replace(start_pos, from.length(), to); + return true; +} + +// Modularize converts a string into a ruby module compatible name +inline TString Modularize(TString s) { + if (s.empty()) { + return s; + } + TString new_string = ""; + bool was_last_underscore = false; + new_string.append(1, ::toupper(s[0])); + for (TString::size_type i = 1; i < s.size(); ++i) { + if (was_last_underscore && s[i] != '_') { + new_string.append(1, ::toupper(s[i])); + } else if (s[i] != '_') { + new_string.append(1, s[i]); + } + was_last_underscore = s[i] == '_'; + } + return new_string; +} + +// RubyPackage gets the ruby package in either proto or ruby_package format +inline TString RubyPackage(const grpc::protobuf::FileDescriptor* file) { + TString package_name = file->package(); + if (file->options().has_ruby_package()) { + package_name = file->options().ruby_package(); + + // If :: is in the package convert the Ruby formatted name + // -> A::B::C + // to use the dot seperator notation + // -> A.B.C + package_name = ReplaceAll(package_name, "::", "."); + } + return package_name; +} + +// RubyTypeOf updates a proto type to the required ruby equivalent. +inline TString RubyTypeOf(const grpc::protobuf::Descriptor* descriptor) { + TString proto_type = descriptor->full_name(); + if (descriptor->file()->options().has_ruby_package()) { + // remove the leading package if present + ReplacePrefix(&proto_type, descriptor->file()->package(), ""); + ReplacePrefix(&proto_type, ".", ""); // remove the leading . (no package) + proto_type = RubyPackage(descriptor->file()) + "." + proto_type; + } + TString res("." + proto_type); + if (res.find('.') == TString::npos) { + return res; + } else { + std::vector<TString> prefixes_and_type = Split(res, '.'); + res.clear(); + for (unsigned int i = 0; i < prefixes_and_type.size(); ++i) { + if (i != 0) { + res += "::"; // switch '.' to the ruby module delim + } + if (i < prefixes_and_type.size() - 1) { + res += Modularize(prefixes_and_type[i]); // capitalize pkgs + } else { + res += prefixes_and_type[i]; + } + } + return res; + } +} + +} // namespace grpc_ruby_generator + +#endif // GRPC_INTERNAL_COMPILER_RUBY_GENERATOR_STRING_INL_H |