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
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:
74 static Promise<File> open(const Loop &loop, std::string_view path,
75 int flags = 0, int mode = 0644);
76 static Promise<void> unlink(const Loop &loop, std::string_view path);
77
85 Promise<size_t> read(std::string &buffer, int64_t offset = -1);
86
90 Promise<size_t> write(std::string_view buffer, int64_t offset = -1);
91
93 [[nodiscard]] uv_file file() const;
94
97
98private:
99 File(uv_loop_t *loop, uv_file file) : loop_{loop}, file_(file) {}
100
101 uv_loop_t *loop_;
102 uv_file file_;
103};
104
105class FsWatch {
106public:
107 FsWatch(const FsWatch &) = delete;
108 FsWatch(FsWatch &&) = default;
109 FsWatch &operator=(const FsWatch &) = delete;
110 FsWatch &operator=(FsWatch &&) = default;
111
114 ~FsWatch();
115
118 static Promise<FsWatch> create(const Loop &loop, std::string_view path);
119
123 static Promise<FsWatch> createRecursive(const Loop &loop,
124 std::string_view path);
125
128 struct FileEvent {
129 FileEvent(std::string p, uv_fs_event e)
130 : path{std::move(p)}, events{e}, status{} {}
131 explicit FileEvent(uv_status s) : events{}, status{s} {}
132 FileEvent(FileEvent &&) = default;
134 FileEvent(const FileEvent &) = default;
135 FileEvent &operator=(const FileEvent &) = default;
136 ~FileEvent() = default;
137
138 std::string path;
139 uv_fs_event events;
141 };
142
143 // Start watching the file or path. Events that occurred before calling
144 // watch() are dropped.
145 //
146 // Note: watch() may be only called once at a time. However, after
147 // stopWatch(), watch() can be called again.
149
150 // In order to ensure a clean shutdown, call stopWatch() before dropping the
151 // FsWatch, and consume all remaining events until the watch() generator
152 // returns std::nullopt.
153 //
154 // You must supply the generator returned by watch() to ensure completion of
155 // all events.
157
158 // Call this to retire the libuv handle.
160
161private:
162 static Promise<FsWatch> createWithFlag(const Loop &loop,
163 std::string_view path,
164 uv_fs_event_flags flags);
165 FsWatch();
166
168 static void onFsWatcherEvent(uv_fs_event_t *handle, const char *path,
169 int events, uv_status status);
170
172 static constexpr unsigned defaultCapacity = 128;
173
175
176 [[nodiscard]] bool await_ready() const;
177 void await_suspend(std::coroutine_handle<> handle);
178 bool await_resume();
179
180 void schedule();
181 void stop();
182 void addError(uv_status status);
183 void addEvent(FileEvent event);
184
185 std::optional<std::coroutine_handle<>> handle_;
187 bool stopped_{};
188 };
189
190 std::unique_ptr<uv_fs_event_t> uv_handle_{};
191};
192
194
195} // namespace uvco
Definition bounded_queue.h:23
Definition fs.h:30
static MultiPromise< DirEnt > readAll(const Loop &loop, std::string_view path)
Read all directory entries of the given directory.
Definition fs.cc:184
uv_dir_t * dir_
Definition fs.h:66
Promise< void > close()
Close the directory.
Definition fs.cc:199
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:156
static Promise< Directory > open(const Loop &loop, std::string_view path)
Open a directory for reading.
Definition fs.cc:145
Directory(const Directory &)=default
static Promise< void > mkdir(const Loop &loop, std::string_view path, int mode=0755)
Create a directory.
Definition fs.cc:122
~Directory()
Definition fs.cc:113
static Promise< void > rmdir(const Loop &loop, std::string_view path)
Remove a directory. It must be empty.
Definition fs.cc:134
Directory(uv_loop_t *loop, uv_dir_t *dir)
Definition fs.h:63
A file descriptor.
Definition fs.h:70
Promise< size_t > read(std::string &buffer, int64_t offset=-1)
Definition fs.cc:231
uv_loop_t * loop_
Definition fs.h:101
static Promise< void > unlink(const Loop &loop, std::string_view path)
Definition fs.cc:221
Promise< size_t > write(std::string_view buffer, int64_t offset=-1)
Definition fs.cc:249
File(uv_loop_t *loop, uv_file file)
Definition fs.h:99
uv_file file_
Definition fs.h:102
static Promise< File > open(const Loop &loop, std::string_view path, int flags=0, int mode=0644)
Definition fs.cc:207
uv_file file() const
Access the libuv file handle.
Definition fs.cc:267
Promise< void > close()
Close a file asynchronously.
Definition fs.cc:272
Definition fs.h:105
MultiPromise< FileEvent > watch_()
Definition fs.cc:338
MultiPromise< FileEvent > watch()
Definition fs.cc:331
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:299
Promise< void > close()
Definition fs.cc:354
Promise< void > stopWatch(MultiPromise< FileEvent > watcher)
Definition fs.cc:348
std::unique_ptr< uv_fs_event_t > uv_handle_
Definition fs.h:190
static Promise< FsWatch > create(const Loop &loop, std::string_view path)
Definition fs.cc:295
static Promise< FsWatch > createWithFlag(const Loop &loop, std::string_view path, uv_fs_event_flags flags)
Definition fs.cc:304
~FsWatch()
Definition fs.cc:285
static void onFsWatcherEvent(uv_fs_event_t *handle, const char *path, int events, uv_status status)
Definition fs.cc:359
FsWatch()
Definition fs.cc:283
Definition loop.h:26
Definition multipromise.h:133
Definition promise.h:76
int uv_status
Result of a libuv operation, an errno error code.
Definition internal_utils.h:22
Definition async_work.cc:17
Definition fs.h:38
uv_dirent_type_t type
Definition fs.h:40
std::string name
Definition fs.h:39
Definition fs.h:128
uv_status status
Definition fs.h:140
std::string path
Definition fs.h:138
FileEvent(uv_status s)
Definition fs.h:131
FileEvent(std::string p, uv_fs_event e)
Definition fs.h:129
FileEvent & operator=(const FileEvent &)=default
FileEvent & operator=(FileEvent &&)=default
uv_fs_event events
Definition fs.h:139
FileEvent(FileEvent &&)=default
FileEvent(const FileEvent &)=default
bool await_ready() const
Definition fs.cc:377
void schedule()
Definition fs.cc:392
void await_suspend(std::coroutine_handle<> handle)
Definition fs.cc:381
static constexpr unsigned defaultCapacity
Definition fs.h:172
BoundedQueue< FileEvent > events_
Definition fs.h:186
void stop()
Definition fs.cc:400
void addError(uv_status status)
Definition fs.cc:405
void addEvent(FileEvent event)
Definition fs.cc:412
FsWatchAwaiter_()
Definition fs.cc:375
std::optional< std::coroutine_handle<> > handle_
Definition fs.h:185
bool await_resume()
Definition fs.cc:386
bool stopped_
Definition fs.h:187