uvco 0.1
Loading...
Searching...
No Matches
fs.h
Go to the documentation of this file.
1// uvco (c) 2024 Lewin Bormann. See LICENSE for specific terms.
2
3#pragma once
4
5#include <memory>
6#include <uv.h>
7#include <uv/unix.h>
8
11#include "uvco/loop/loop.h"
14
15#include <coroutine>
16#include <cstddef>
17#include <cstdint>
18#include <optional>
19#include <span>
20#include <string>
21#include <string_view>
22#include <utility>
23#include <vector>
24
25namespace uvco {
26
29
30class Directory {
31public:
32 Directory(const Directory &) = default;
33 Directory(Directory &&other) noexcept;
34 Directory &operator=(const Directory &) = delete;
35 Directory &operator=(Directory &&other) noexcept;
36 ~Directory();
37
38 struct DirEnt {
39 std::string name;
40 uv_dirent_type_t type;
41 };
42
44 static Promise<void> mkdir(const Loop &loop, std::string_view path,
45 int mode = 0755);
47 static Promise<void> rmdir(const Loop &loop, std::string_view path);
49 static Promise<Directory> open(const Loop &loop, std::string_view path);
51 static MultiPromise<DirEnt> readAll(const Loop &loop, std::string_view path);
52
54 Promise<std::vector<DirEnt>> read(unsigned count = 64);
55
57 Promise<unsigned int> read(std::span<DirEnt> buffer);
58
60 void close();
61
62private:
63 explicit Directory(uv_loop_t *loop, uv_dir_t *dir) : loop_{loop}, dir_{dir} {}
64
65 uv_loop_t *loop_;
66 uv_dir_t *dir_;
67};
68
70class File {
71public:
72 File(const File &) = delete;
73 File(File &&other) noexcept;
74 File &operator=(const File &) = delete;
75 File &operator=(File &&other) noexcept;
76 ~File();
77
80 static Promise<File> open(const Loop &loop, std::string_view path,
81 int flags = 0, int mode = 0644);
82 static Promise<void> unlink(const Loop &loop, std::string_view path);
83
97 Promise<size_t> read(std::string &buffer, int64_t offset = -1);
98
102 Promise<size_t> write(std::string_view buffer, int64_t offset = -1);
103
105 [[nodiscard]] uv_file file() const;
106
108 void close();
109
110private:
111 File(uv_loop_t *loop, uv_file file) : loop_{loop}, file_(file) {}
112
113 uv_loop_t *loop_;
114 uv_file file_;
115};
116
117class FsWatch {
118 struct FsWatchAwaiter_;
119
120public:
121 FsWatch(const FsWatch &) = delete;
122 FsWatch(FsWatch &&) = default;
123 FsWatch &operator=(const FsWatch &) = delete;
124 FsWatch &operator=(FsWatch &&) = default;
125
128 ~FsWatch();
129
132 static Promise<FsWatch> create(const Loop &loop, std::string_view path);
133
137 static Promise<FsWatch> createRecursive(const Loop &loop,
138 std::string_view path);
139
142 struct FileEvent {
143 FileEvent(std::string p, uv_fs_event e)
144 : path{std::move(p)}, events{e}, status{} {}
145 explicit FileEvent(uv_status s) : events{}, status{s} {}
146 FileEvent(FileEvent &&) = default;
148 FileEvent(const FileEvent &) = default;
149 FileEvent &operator=(const FileEvent &) = default;
150 ~FileEvent() = default;
151
152 std::string path;
153 uv_fs_event events;
155 };
156
157 // Start watching the file or path. Events that occurred before calling
158 // watch() are dropped.
159 //
160 // Note: watch() may be only called once at a time. However, after
161 // stopWatch(), watch() can be called again.
163
164 // In order to ensure a clean shutdown, call stopWatch() before dropping the
165 // FsWatch, and consume all remaining events until the watch() generator
166 // returns std::nullopt.
167 //
168 // You must supply the generator returned by watch() to ensure completion of
169 // all events.
171
172 // Call this to retire the libuv handle.
173 void close();
174
175private:
176 FsWatch();
177 static Promise<FsWatch> createWithFlag(const Loop &loop,
178 std::string_view path,
179 uv_fs_event_flags flags);
180
182 static void onFsWatcherEvent(uv_fs_event_t *handle, const char *path,
183 int events, uv_status status);
184
185 std::unique_ptr<uv_fs_event_t> uv_handle_{};
186};
187
189
190} // namespace uvco
static MultiPromise< DirEnt > readAll(const Loop &loop, std::string_view path)
Read all directory entries of the given directory.
Definition fs.cc:208
void close()
Close the directory.
Definition fs.cc:223
uv_dir_t * dir_
Definition fs.h:66
Directory & operator=(const Directory &)=delete
uv_loop_t * loop_
Definition fs.h:65
Promise< std::vector< DirEnt > > read(unsigned count=64)
Read up to count directory entries.
Definition fs.cc:180
static Promise< Directory > open(const Loop &loop, std::string_view path)
Open a directory for reading.
Definition fs.cc:168
Directory(const Directory &)=default
static Promise< void > mkdir(const Loop &loop, std::string_view path, int mode=0755)
Create a directory.
Definition fs.cc:143
~Directory()
Definition fs.cc:141
static Promise< void > rmdir(const Loop &loop, std::string_view path)
Remove a directory. It must be empty.
Definition fs.cc:156
Directory(uv_loop_t *loop, uv_dir_t *dir)
Definition fs.h:63
Promise< size_t > read(std::string &buffer, int64_t offset=-1)
Definition fs.cc:277
File & operator=(const File &)=delete
uv_loop_t * loop_
Definition fs.h:113
static Promise< void > unlink(const Loop &loop, std::string_view path)
Definition fs.cc:266
Promise< size_t > write(std::string_view buffer, int64_t offset=-1)
Definition fs.cc:294
File(uv_loop_t *loop, uv_file file)
Definition fs.h:111
uv_file file_
Definition fs.h:114
static Promise< File > open(const Loop &loop, std::string_view path, int flags=0, int mode=0644)
Definition fs.cc:251
~File()
Definition fs.cc:230
void close()
Close a file.
Definition fs.cc:316
uv_file file() const
Access the libuv file handle.
Definition fs.cc:311
File(const File &)=delete
MultiPromise< FileEvent > watch_()
Definition fs.cc:440
MultiPromise< FileEvent > watch()
Definition fs.cc:433
FsWatch & operator=(const FsWatch &)=delete
FsWatch(FsWatch &&)=default
FsWatch(const FsWatch &)=delete
FsWatch & operator=(FsWatch &&)=default
static Promise< FsWatch > createRecursive(const Loop &loop, std::string_view path)
Definition fs.cc:404
Promise< void > stopWatch(MultiPromise< FileEvent > watcher)
Definition fs.cc:450
void close()
Definition fs.cc:456
std::unique_ptr< uv_fs_event_t > uv_handle_
Definition fs.h:185
static Promise< FsWatch > create(const Loop &loop, std::string_view path)
Definition fs.cc:400
static Promise< FsWatch > createWithFlag(const Loop &loop, std::string_view path, uv_fs_event_flags flags)
Definition fs.cc:409
~FsWatch()
Definition fs.cc:390
static void onFsWatcherEvent(uv_fs_event_t *handle, const char *path, int events, uv_status status)
Definition fs.cc:458
FsWatch()
Definition fs.cc:388
Definition loop.h:26
Definition multipromise.h:127
Definition promise.h:49
int uv_status
Result of a libuv operation, an errno error code.
Definition internal_utils.h:22
Definition async_work.cc:18
Definition fs.h:38
uv_dirent_type_t type
Definition fs.h:40
std::string name
Definition fs.h:39
uv_status status
Definition fs.h:154
std::string path
Definition fs.h:152
FileEvent(uv_status s)
Definition fs.h:145
FileEvent(std::string p, uv_fs_event e)
Definition fs.h:143
FileEvent & operator=(const FileEvent &)=default
FileEvent & operator=(FileEvent &&)=default
uv_fs_event events
Definition fs.h:153
FileEvent(FileEvent &&)=default
FileEvent(const FileEvent &)=default
Definition fs.cc:323