Sane C++ Libraries
C++ Platform Abstraction Libraries
Loading...
Searching...
No Matches
FileSystemError.h
1// Copyright (c) Stefano Cristiano
2// SPDX-License-Identifier: MIT
3#pragma once
4
5#include "../Common/Result.h"
6
7namespace SC
8{
11
13enum class FileSystemError : uint32_t
14{
15 NotInitialized = 1,
16 UnsupportedPathEncoding,
17 InvalidPath,
18 PathMustBeAbsolute,
19 PathCapacityExceeded,
20 InvalidState,
21 EntryNotFound,
22 EntryAlreadyExists,
23 EntryTypeMismatch,
24 AccessDenied,
25 ReadOnlyFileSystem,
26 StorageCapacityExceeded,
27 DirectoryNotEmpty,
28 TooManyLinks,
29 SymbolicLinkLoop,
30 CrossDeviceOperation,
31 InvalidArgument,
32 OperationUnsupported,
33 OutOfMemory,
34 BufferCapacityExceeded,
35 FileTooLarge,
36 IncompleteRead,
37 IncompleteWrite,
38 UnsupportedEntryType,
39 IoFailure,
40 OperationFailed,
41};
42
44enum class FileSystemErrorDetail : uint16_t
45{
46 None = 0,
47 ValidatePathEncoding,
48 NormalizePath,
49 ValidateAbsoluteBasePath,
50 BuildTransportPath,
51 ChangeDirectory,
52 CheckAccess,
53 QueryEntryMetadata,
54 OpenFileForRead,
55 OpenFileForWrite,
56 QueryFileSize,
57 GrowReadBuffer,
58 ReadFileContent,
59 WriteFileContent,
60 AppendFileContent,
61 CreateDirectoryEntry,
62 CreateParentDirectory,
63 RemoveFileEntry,
64 RemoveDirectoryEntry,
65 RenameEntry,
66 CreateSymbolicLinkEntry,
67 CreateHardLinkEntry,
68 ReadSymbolicLinkTarget,
69 StoreSymbolicLinkTarget,
70 ChangePermissions,
71 ChangeOwnership,
72 ChangeLinkPermissions,
73 ChangeLinkOwnership,
74 ChangeModifiedTime,
75 CopyFileEntry,
76 CopyDirectoryTree,
77 CloneEntry,
78 OpenSourceFile,
79 OpenDestinationFile,
80 OpenSourceDirectory,
81 EnumerateDirectory,
82 BuildChildPath,
83 QueryChildMetadata,
84 CopyChildEntry,
85 RemoveChildEntry,
86 WindowsQueryReparsePoint,
87 QueryFileTimes,
88 SetFileTimes,
89};
90
92enum class FileSystemErrorContextKind : uint16_t
93{
94 None = 0,
95 NativeError,
96 RequiredBytes,
97 ActualBytes,
98};
99
102{
104 {
105 };
107 {
108 };
109
110 uint32_t nativeError;
111 uint32_t requiredBytes;
112 uint32_t actualBytes;
113
114 constexpr FileSystemErrorContext(uint32_t value = 0) : nativeError(value) {}
115 constexpr FileSystemErrorContext(RequiredBytes, uint32_t value) : requiredBytes(value) {}
116 constexpr FileSystemErrorContext(ActualBytes, uint32_t value) : actualBytes(value) {}
117};
118
120static constexpr ResultCategory FileSystemResultCategory = ResultCategory(11);
121
125struct [[nodiscard]] ResultFileSystem
126{
127 Result result;
128 FileSystemErrorDetail detail = FileSystemErrorDetail::None;
129 FileSystemErrorContextKind contextKind = FileSystemErrorContextKind::None;
130 FileSystemErrorContext context = {};
131
132 constexpr ResultFileSystem() : result(true) {}
133 explicit constexpr ResultFileSystem(bool valid) : result(valid) {}
134 constexpr ResultFileSystem(FileSystemError error, FileSystemErrorDetail detail = FileSystemErrorDetail::None)
135 : result(Result::Error(FileSystemResultCategory, error)), detail(detail)
136 {}
139 : result(Result::Error(FileSystemResultCategory, error)), detail(detail), contextKind(contextKind),
140 context(context)
141 {}
142 constexpr ResultFileSystem(Result result) : result(result) {}
143
144 template <typename ResultLike>
145 constexpr ResultFileSystem(const ResultLike& other) : result(other.toResult())
146 {}
147
148 static constexpr ResultFileSystem withNativeError(FileSystemError error, FileSystemErrorDetail detail,
149 uint32_t nativeError)
150 {
151 return {error, detail, FileSystemErrorContextKind::NativeError, FileSystemErrorContext(nativeError)};
152 }
153
154 static constexpr ResultFileSystem withRequiredBytes(FileSystemError error, FileSystemErrorDetail detail,
155 uint32_t requiredBytes)
156 {
157 return {error, detail, FileSystemErrorContextKind::RequiredBytes,
159 }
160
161 static constexpr ResultFileSystem withActualBytes(FileSystemError error, FileSystemErrorDetail detail,
162 uint32_t actualBytes)
163 {
164 return {error, detail, FileSystemErrorContextKind::ActualBytes,
166 }
167
168 explicit constexpr operator bool() const { return static_cast<bool>(result); }
169 constexpr operator Result() const { return result; }
170 constexpr Result toResult() const { return result; }
171 constexpr bool isError(FileSystemError error) const { return result.isError(FileSystemResultCategory, error); }
172};
173
175} // namespace SC
FileSystemErrorContextKind
Kind of scalar diagnostic context stored in ResultFileSystem.
Definition FileSystemError.h:93
FileSystemErrorDetail
Stable logical operation or backend stage retained for a FileSystem failure.
Definition FileSystemError.h:45
FileSystemError
Stable portable failures returned by the FileSystem library.
Definition FileSystemError.h:14
Definition FileSystemError.h:107
Definition FileSystemError.h:104
FileSystem result retaining an operation detail and one scalar diagnostic context.
Definition FileSystemError.h:126
Typed scalar payload for a FileSystem error.
Definition FileSystemError.h:102