1 #include "quiche/common/platform/api/quiche_file_utils.h"
2
3 #include <optional>
4
5 #include "quiche_platform_impl/quiche_file_utils_impl.h"
6
7 namespace quiche {
8
JoinPath(absl::string_view a,absl::string_view b)9 std::string JoinPath(absl::string_view a, absl::string_view b) {
10 return JoinPathImpl(a, b);
11 }
12
ReadFileContents(absl::string_view file)13 std::optional<std::string> ReadFileContents(absl::string_view file) {
14 return ReadFileContentsImpl(file);
15 }
16
EnumerateDirectory(absl::string_view path,std::vector<std::string> & directories,std::vector<std::string> & files)17 bool EnumerateDirectory(absl::string_view path,
18 std::vector<std::string>& directories,
19 std::vector<std::string>& files) {
20 return EnumerateDirectoryImpl(path, directories, files);
21 }
22
EnumerateDirectoryRecursivelyInner(absl::string_view path,int recursion_limit,std::vector<std::string> & files)23 bool EnumerateDirectoryRecursivelyInner(absl::string_view path,
24 int recursion_limit,
25 std::vector<std::string>& files) {
26 if (recursion_limit < 0) {
27 return false;
28 }
29
30 std::vector<std::string> local_files;
31 std::vector<std::string> directories;
32 if (!EnumerateDirectory(path, directories, local_files)) {
33 return false;
34 }
35 for (const std::string& directory : directories) {
36 if (!EnumerateDirectoryRecursivelyInner(JoinPath(path, directory),
37 recursion_limit - 1, files)) {
38 return false;
39 }
40 }
41 for (const std::string& file : local_files) {
42 files.push_back(JoinPath(path, file));
43 }
44 return true;
45 }
46
EnumerateDirectoryRecursively(absl::string_view path,std::vector<std::string> & files)47 bool EnumerateDirectoryRecursively(absl::string_view path,
48 std::vector<std::string>& files) {
49 constexpr int kRecursionLimit = 20;
50 return EnumerateDirectoryRecursivelyInner(path, kRecursionLimit, files);
51 }
52
53 } // namespace quiche
54