Sane C++ Libraries
C++ Platform Abstraction Libraries
Loading...
Searching...
No Matches
FileError.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 FileError : uint32_t
14{
15 InvalidHandle = 1,
16 UnsupportedPathEncoding,
17 InvalidPath,
18 PathMustBeAbsolute,
19 PathCapacityExceeded,
20 InvalidNamedPipeName,
21 InvalidState,
22 OperationUnsupported,
23 OpenFailed,
24 CloseFailed,
25 ReadFailed,
26 WriteFailed,
27 IncompleteWrite,
28 SeekFailed,
29 MetadataQueryFailed,
30 PermissionsChangeFailed,
31 OwnershipChangeFailed,
32 SyncFailed,
33 TruncateFailed,
34 DuplicateFailed,
35 DescriptorConfigurationFailed,
36 PipeCreationFailed,
37 NamedPipeCreationFailed,
38 NamedPipeConnectionFailed,
39 NamedPipeAcceptFailed,
40 EndpointCleanupFailed,
41 BufferCapacityExceeded,
42 WouldBlock,
43 TimedOut,
44 OperationCancelled,
45 PipeDisconnected,
46};
47
49enum class FileErrorDetail : uint16_t
50{
51 None = 0,
52 ValidatePathEncoding,
53 NormalizePath,
54 ValidateAbsolutePath,
55 BuildTransportPath,
56 OpenFile,
57 CloseDescriptor,
58 ReadDescriptor,
59 ReadDescriptorAtOffset,
60 GrowReadBuffer,
61 ResetReadBuffer,
62 WriteDescriptor,
63 WriteDescriptorAtOffset,
64 SeekDescriptor,
65 QueryDescriptorPosition,
66 QueryDescriptorSize,
67 QueryDescriptorMetadata,
68 ChangeDescriptorPermissions,
69 ChangeDescriptorOwnership,
70 SynchronizeDescriptor,
71 SynchronizeDescriptorData,
72 TruncateDescriptor,
73 GetStandardHandle,
74 DuplicateStandardHandle,
75 CreateAnonymousPipe,
76 DuplicatePipeDescriptor,
77 AssignPipeDescriptor,
78 QueryDescriptorFlags,
79 ConfigureDescriptorFlags,
80 ValidateNamedPipeLogicalName,
81 BuildNamedPipePath,
82 ValidateNamedPipePath,
83 CreateNamedPipeServer,
84 RemoveNamedPipeEndpoint,
85 BindNamedPipeServer,
86 ListenNamedPipeServer,
87 AcceptNamedPipeConnection,
88 WaitNamedPipeClient,
89 ConnectNamedPipeClient,
90 DuplicateNamedPipeConnection,
91};
92
94enum class FileErrorContextKind : uint16_t
95{
96 None = 0,
97 NativeError,
98 RequiredBytes,
99 ActualBytes,
100};
101
104{
106 {
107 };
109 {
110 };
111
112 uint32_t nativeError;
113 uint32_t requiredBytes;
114 uint32_t actualBytes;
115
116 constexpr FileErrorContext(uint32_t value = 0) : nativeError(value) {}
117 constexpr FileErrorContext(RequiredBytes, uint32_t value) : requiredBytes(value) {}
118 constexpr FileErrorContext(ActualBytes, uint32_t value) : actualBytes(value) {}
119};
120
122static constexpr ResultCategory FileResultCategory = ResultCategory(10);
123
127struct [[nodiscard]] ResultFile
128{
129 Result result;
130 FileErrorDetail detail = FileErrorDetail::None;
131 FileErrorContextKind contextKind = FileErrorContextKind::None;
132 FileErrorContext context = {};
133
134 constexpr ResultFile() : result(true) {}
135 explicit constexpr ResultFile(bool valid) : result(valid) {}
136 constexpr ResultFile(FileError error, FileErrorDetail detail = FileErrorDetail::None)
137 : result(Result::Error(FileResultCategory, error)), detail(detail)
138 {}
139 constexpr ResultFile(FileError error, FileErrorDetail detail, FileErrorContextKind contextKind,
140 FileErrorContext context)
141 : result(Result::Error(FileResultCategory, error)), detail(detail), contextKind(contextKind), context(context)
142 {}
143 constexpr ResultFile(Result result) : result(result) {}
144
145 template <typename ResultLike>
146 constexpr ResultFile(const ResultLike& other) : result(other.toResult())
147 {}
148
149 static constexpr ResultFile withNativeError(FileError error, FileErrorDetail detail, uint32_t nativeError)
150 {
151 return {error, detail, FileErrorContextKind::NativeError, FileErrorContext(nativeError)};
152 }
153
154 static constexpr ResultFile withRequiredBytes(FileError error, FileErrorDetail detail, uint32_t requiredBytes)
155 {
156 return {error, detail, FileErrorContextKind::RequiredBytes,
158 }
159
160 static constexpr ResultFile withActualBytes(FileError error, FileErrorDetail detail, uint32_t actualBytes)
161 {
162 return {error, detail, FileErrorContextKind::ActualBytes,
164 }
165
166 explicit constexpr operator bool() const { return static_cast<bool>(result); }
167 constexpr operator Result() const { return result; }
168 constexpr Result toResult() const { return result; }
169 constexpr bool isError(FileError error) const { return result.isError(FileResultCategory, error); }
170};
171
173} // namespace SC
FileError
Stable portable failures returned by the File library.
Definition FileError.h:14
FileErrorContextKind
Kind of scalar diagnostic context stored in ResultFile.
Definition FileError.h:95
FileErrorDetail
Stable logical operation or native backend stage retained for a File failure.
Definition FileError.h:50
Definition FileError.h:109
Definition FileError.h:106
File result retaining an operation detail and one scalar diagnostic context.
Definition FileError.h:128
Typed scalar payload for a File error.
Definition FileError.h:104