aboutsummaryrefslogtreecommitdiff
path: root/src/main.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-02-25 15:34:17 -0800
committerAndrew Kelley <andrew@ziglang.org>2025-02-26 11:42:03 -0800
commita70307e7ffc608643bbd940796eaeb5bca6bbc8f (patch)
tree544804a8aaa72e04e427b2c4c3932e465a30a97c /src/main.zig
parenteff1716b6c7800e6876d95d900b472fe351b0355 (diff)
downloadzig-a70307e7ffc608643bbd940796eaeb5bca6bbc8f.tar.gz
zig-a70307e7ffc608643bbd940796eaeb5bca6bbc8f.zip
CLI: add unit test and improve sanitizeExampleName
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/main.zig b/src/main.zig
index cbdc32e203..f32d205538 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -4773,22 +4773,36 @@ fn cmdInit(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
}
fn sanitizeExampleName(arena: Allocator, bytes: []const u8) error{OutOfMemory}![]const u8 {
- if (bytes.len == 0) return "foo";
var result: std.ArrayListUnmanaged(u8) = .empty;
- try result.append(arena, switch (bytes[0]) {
- '_', 'a'...'z', 'A'...'Z' => |c| c,
- else => '_',
- });
- for (bytes[1..]) |byte| switch (byte) {
- '_', 'a'...'z', 'A'...'Z', '0'...'9' => try result.append(arena, byte),
+ for (bytes, 0..) |byte, i| switch (byte) {
+ '0'...'9' => {
+ if (i == 0) try result.append(arena, '_');
+ try result.append(arena, byte);
+ },
+ '_', 'a'...'z', 'A'...'Z' => try result.append(arena, byte),
+ '-', '.', ' ' => try result.append(arena, '_'),
else => continue,
};
+ if (result.items.len == 0) return "foo";
if (result.items.len > Package.Manifest.max_name_len)
result.shrinkRetainingCapacity(Package.Manifest.max_name_len);
return result.toOwnedSlice(arena);
}
+test sanitizeExampleName {
+ var arena_instance = std.heap.ArenaAllocator.init(std.testing.allocator);
+ defer arena_instance.deinit();
+ const arena = arena_instance.allocator();
+
+ try std.testing.expectEqualStrings("foo_bar", try sanitizeExampleName(arena, "foo bar+"));
+ try std.testing.expectEqualStrings("foo", try sanitizeExampleName(arena, ""));
+ try std.testing.expectEqualStrings("foo", try sanitizeExampleName(arena, "!"));
+ try std.testing.expectEqualStrings("a", try sanitizeExampleName(arena, "!a"));
+ try std.testing.expectEqualStrings("a_b", try sanitizeExampleName(arena, "a.b!"));
+ try std.testing.expectEqualStrings("_01234", try sanitizeExampleName(arena, "01234"));
+}
+
fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void {
dev.check(.build_command);