Commit a61678b754

Carmen <carmen@dotcarmen.dev>
2025-04-02 23:34:48
dont return tuple, split into 2 functions
1 parent 45afde2
Changed files (1)
lib
std
os
uefi
protocol
lib/std/os/uefi/protocol/file.zig
@@ -52,12 +52,15 @@ pub const File = extern struct {
         AccessDenied,
         VolumeFull,
     };
-    pub const GetInfoError = uefi.UnexpectedError || error{
+    pub const GetInfoSizeError = uefi.UnexpectedError || error{
         Unsupported,
         NoMedia,
         DeviceError,
         VolumeCorrupted,
     };
+    pub const GetInfoError = GetInfoSizeError || error{
+        BufferTooSmall,
+    };
     pub const SetInfoError = uefi.UnexpectedError || error{
         Unsupported,
         NoMedia,
@@ -215,25 +218,39 @@ pub const File = extern struct {
         try self.setPosition(pos);
     }
 
-    /// If the underlying function returns `.buffer_too_small`, then this function
-    /// returns `.{ len, null }`. Otherwise, the 2nd value of the tuple contains
-    /// the casted reference from the buffer.
+    pub fn getInfoSize(self: *const File, comptime info: std.meta.Tag(Info)) GetInfoError!usize {
+        const InfoType = @FieldType(Info, @tagName(info));
+
+        var len: usize = 0;
+        switch (self._get_info(self, &InfoType.guid, &len, null)) {
+            .success, .buffer_too_small => return len,
+            .unsupported => return Error.Unsupported,
+            .no_media => return Error.NoMedia,
+            .device_error => return Error.DeviceError,
+            .volume_corrupted => return Error.VolumeCorrupted,
+            else => |status| return uefi.unexpectedStatus(status),
+        }
+    }
+
+    /// If `buffer` is too small to contain all of the info, this function returns
+    /// `Error.BufferTooSmall`. You should call `getInfoSize` first to determine
+    /// how big the buffer should be to safely call this function.
     pub fn getInfo(
         self: *const File,
         comptime info: std.meta.Tag(Info),
-        buffer: ?[]u8,
+        buffer: []u8,
     ) GetInfoError!struct { usize, @FieldType(Info, @tagName(info)) } {
         const InfoType = @FieldType(Info, @tagName(info));
 
-        var len = if (buffer) |b| b.len else 0;
+        var len = buffer.len;
         switch (self._get_info(
             self,
             &InfoType.guid,
             &len,
-            if (buffer) |b| b else null,
+            buffer.ptr,
         )) {
-            .success => return .{ len, @as(*InfoType, @ptrCast(buffer.ptr)) },
-            .buffer_too_small => return .{ len, null },
+            .success => return @as(*InfoType, @ptrCast(buffer.ptr)),
+            .buffer_too_small => return Error.BufferTooSmall,
             .unsupported => return Error.Unsupported,
             .no_media => return Error.NoMedia,
             .device_error => return Error.DeviceError,