|  | #include "common/platform/api/quiche_file_utils.h" | 
|  |  | 
|  | #include "quiche_platform_impl/quiche_file_utils_impl.h" | 
|  |  | 
|  | namespace quiche { | 
|  |  | 
|  | std::string JoinPath(absl::string_view a, absl::string_view b) { | 
|  | return JoinPathImpl(a, b); | 
|  | } | 
|  |  | 
|  | absl::optional<std::string> ReadFileContents(absl::string_view file) { | 
|  | return ReadFileContentsImpl(file); | 
|  | } | 
|  |  | 
|  | bool EnumerateDirectory(absl::string_view path, | 
|  | std::vector<std::string>& directories, | 
|  | std::vector<std::string>& files) { | 
|  | return EnumerateDirectoryImpl(path, directories, files); | 
|  | } | 
|  |  | 
|  | bool EnumerateDirectoryRecursivelyInner(absl::string_view path, | 
|  | int recursion_limit, | 
|  | std::vector<std::string>& files) { | 
|  | if (recursion_limit < 0) { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | std::vector<std::string> local_files; | 
|  | std::vector<std::string> directories; | 
|  | if (!EnumerateDirectory(path, directories, local_files)) { | 
|  | return false; | 
|  | } | 
|  | for (const std::string& directory : directories) { | 
|  | if (!EnumerateDirectoryRecursivelyInner(JoinPath(path, directory), | 
|  | recursion_limit - 1, files)) { | 
|  | return false; | 
|  | } | 
|  | } | 
|  | for (const std::string& file : local_files) { | 
|  | files.push_back(JoinPath(path, file)); | 
|  | } | 
|  | return true; | 
|  | } | 
|  |  | 
|  | bool EnumerateDirectoryRecursively(absl::string_view path, | 
|  | std::vector<std::string>& files) { | 
|  | constexpr int kRecursionLimit = 20; | 
|  | return EnumerateDirectoryRecursivelyInner(path, kRecursionLimit, files); | 
|  | } | 
|  |  | 
|  | }  // namespace quiche |