Skip to content

Commit d4bb351

Browse files
Added explicit interface example with fd_t
1 parent 8a30d48 commit d4bb351

2 files changed

Lines changed: 44 additions & 14 deletions

File tree

README.md

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -76,20 +76,18 @@ pub const io = struct {
7676
}
7777
};
7878
79-
// A type satisfying the Reader interface (uses default ReadError)
80-
const FixedBufferReader = struct {
81-
buffer: []const u8,
82-
pos: usize = 0,
83-
84-
pub fn read(self: *@This(), out_buffer: []u8) error{}!usize {
85-
const len = @min(self.buffer[self.pos..].len, out_buffer.len);
86-
@memcpy(out_buffer[0..len], self.buffer[self.pos..][0..len]);
87-
self.pos += len;
88-
return len;
89-
}
90-
};
91-
9279
test "use FixedBufferReader as a reader" {
80+
const FixedBufferReader = struct {
81+
buffer: []const u8,
82+
pos: usize = 0,
83+
84+
pub fn read(self: *@This(), out_buffer: []u8) error{}!usize {
85+
const len = @min(self.buffer[self.pos..].len, out_buffer.len);
86+
@memcpy(out_buffer[0..len], self.buffer[self.pos..][0..len]);
87+
self.pos += len;
88+
return len;
89+
}
90+
};
9391
const in_buf: []const u8 = "I really hope that this works!";
9492
var reader = FixedBufferReader{ .buffer = in_buf };
9593
@@ -106,6 +104,18 @@ test "use std.File as a reader" {
106104
107105
try std.testing.expectEqualStrings("Hello, I am a file!", &buffer);
108106
}
107+
108+
test "use std.os.fd_t as a reader with an explicit interface" {
109+
var buffer: [19]u8 = undefined;
110+
var file = try std.os.open("my_file.txt", std.os.O.RDONLY, 0);
111+
try io.readAll(
112+
file,
113+
.{ .read = std.os.read, .ReadError = std.os.ReadError, },
114+
&buffer,
115+
);
116+
117+
try std.testing.expectEqualStrings("Hello, I am a file!", &buffer);
118+
}
109119
```
110120

111121
More in-depth [examples][4] are provided.

examples/read_file.zig

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
const std = @import("std");
22
const io = @import("io.zig");
33
const FixedBufferStream = io.FixedBufferStream;
4+
const Impl = @import("zimpl").Impl;
45

5-
test {
6+
test "read file with std.fs.File" {
67
const file = try std.fs.cwd().openFile("examples/read_file/test.txt", .{});
78
var buffer: [32]u8 = undefined;
89
var fbs: FixedBufferStream = .{ .buffer = &buffer };
@@ -12,3 +13,22 @@ test {
1213
fbs.getWritten(),
1314
);
1415
}
16+
17+
test "read file with std.os.fd_t" {
18+
const fd = try std.os.open(
19+
"examples/read_file/test.txt",
20+
std.os.O.RDONLY,
21+
0,
22+
);
23+
const fd_reader: Impl(std.os.fd_t, io.Reader) = .{
24+
.read = std.os.read,
25+
.ReadError = std.os.ReadError,
26+
};
27+
var buffer: [32]u8 = undefined;
28+
var fbs: FixedBufferStream = .{ .buffer = &buffer };
29+
try io.streamUntilDelimiter(fd, fd_reader, &fbs, .{}, '\n', 32);
30+
try std.testing.expectEqualStrings(
31+
"Hello, I am a file!",
32+
fbs.getWritten(),
33+
);
34+
}

0 commit comments

Comments
 (0)