Application Context Implementation #4

Closed
kayomn wants to merge 93 commits from event-loop-dev into main
2 changed files with 54 additions and 27 deletions
Showing only changes of commit 90f503f7c0 - Show all commits

View File

@ -187,6 +187,23 @@ test "Spliterating text" {
/// ///
pub const Writer = meta.Function(@sizeOf(usize), []const u8, usize); pub const Writer = meta.Function(@sizeOf(usize), []const u8, usize);
///
/// Returns `true` if `elements` starts with the characters in `with`, otherwise `false`.
///
pub fn begins(comptime Element: type, elements: []const Element, with: []const Element) bool {
if (elements.len < with.len) return false;
return equals(Element, elements[0 .. with.len], with);
}
test "Check memory begins with" {
const bytes_sequence = &.{69, 42};
const testing = std.testing;
try testing.expect(begins(u8, &.{69, 42, 0, 89}, bytes_sequence));
try testing.expect(!begins(u8, &.{69, 89, 42, 0}, bytes_sequence));
}
/// ///
/// Returns `true` if `this` is the same length and contains the same data as `that`, otherwise /// Returns `true` if `this` is the same length and contains the same data as `that`, otherwise
/// `false`. /// `false`.
@ -203,7 +220,7 @@ pub fn equals(comptime Element: type, this: []const Element, that: []const Eleme
return true; return true;
} }
test "Memory buffers equal" { test "Check memory is equals" {
const bytes_sequence = &.{69, 42, 0}; const bytes_sequence = &.{69, 42, 0};
const testing = std.testing; const testing = std.testing;

View File

@ -76,7 +76,7 @@ pub const Path = extern struct {
/// Returns `true` if `this_path` is equal to `that_path, otherwise `false`. /// Returns `true` if `this_path` is equal to `that_path, otherwise `false`.
/// ///
pub fn equals(this_path: Path, that_path: Path) bool { pub fn equals(this_path: Path, that_path: Path) bool {
return core.io.equalsBytes(this_path.buffer[0 ..this_path. return core.io.equals(u8, this_path.buffer[0 ..this_path.
length], that_path.buffer[0 .. that_path.length]); length], that_path.buffer[0 .. that_path.length]);
} }
@ -145,44 +145,54 @@ pub const Path = extern struct {
pub const seperator = '/'; pub const seperator = '/';
}; };
test "Path" {
const testing = std.testing;
const empty_path = Path.empty;
try testing.expectEqual(empty_path.length, 0);
try testing.expect(empty_path.equals(Path.empty));
const joined_component_path = try Path.joined(&.{"path", "to/my", "/file"});
const joined_normalized_path = try Path.joined(&.{"path/to/my/file"});
try testing.expectEqual(empty_path.length, joined_normalized_path.length);
try testing.expect(joined_component_path.equals(joined_normalized_path));
}
/// ///
/// Starts the **O**na **Ar**chive packer utility. /// Starts the **O**na **Ar**chive packer utility.
/// ///
pub fn main() !u8 { pub fn main() u8 {
var gpa = std.heap.GeneralPurposeAllocator(.{}){}; var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer _ = gpa.deinit(); defer std.debug.assert(!gpa.deinit());
const process = std.process;
const allocator = gpa.allocator(); const allocator = gpa.allocator();
const args = try process.argsAlloc(allocator); const out_writer = std.io.getStdOut().writer();
const process = std.process;
const args = process.argsAlloc(allocator) catch {
try out_writer.print("Failed to allocate args memory", .{});
return 1;
};
defer process.argsFree(allocator, args); defer process.argsFree(allocator, args);
const outWriter = std.io.getStdOut().writer(); if (args.len < 2) {
try out_writer.print("Usage: oar [OPTION]... [FILE]...", .{});
try out_writer.print("Options and arguments", .{});
if (args.len > 1) { return 0;
const command = args[1];
const io = core.io;
if (io.equalsBytes(command, "pack")) {
return 0;
}
if (io.equalsBytes(command, "unpack")) {
return 0;
}
try outWriter.print("Unknown command: {s}", .{command});
return 1;
} }
try outWriter.print("{s}", .{args[0]}); const arg = std.mem.sliceTo(args[1], 0);
if (core.io.begins(arg, "--create")) {
return 0;
}
try out_writer.print("Unrecognized command-line option `{s}`", .{arg});
return 0; return 0;
} }
test {
}