| ... | ... | @@ -4773,22 +4773,36 @@ fn cmdInit(gpa: Allocator, arena: Allocator, args: []const []const u8) !void { |
| 4773 | 4773 | } |
| 4774 | 4774 | |
| 4775 | 4775 | fn sanitizeExampleName(arena: Allocator, bytes: []const u8) error{OutOfMemory}![]const u8 { |
| 4776 | | if (bytes.len == 0) return "foo"; |
| 4777 | 4776 | var result: std.ArrayListUnmanaged(u8) = .empty; |
| 4778 | | try result.append(arena, switch (bytes[0]) { |
| 4779 | | '_', 'a'...'z', 'A'...'Z' => |c| c, |
| 4780 | | else => '_', |
| 4781 | | }); |
| 4782 | | for (bytes[1..]) |byte| switch (byte) { |
| 4783 | | '_', 'a'...'z', 'A'...'Z', '0'...'9' => try result.append(arena, byte), |
| 4777 | for (bytes, 0..) |byte, i| switch (byte) { |
| 4778 | '0'...'9' => { |
| 4779 | if (i == 0) try result.append(arena, '_'); |
| 4780 | try result.append(arena, byte); |
| 4781 | }, |
| 4782 | '_', 'a'...'z', 'A'...'Z' => try result.append(arena, byte), |
| 4783 | '-', '.', ' ' => try result.append(arena, '_'), |
| 4784 | 4784 | else => continue, |
| 4785 | 4785 | }; |
| 4786 | if (result.items.len == 0) return "foo"; |
| 4786 | 4787 | if (result.items.len > Package.Manifest.max_name_len) |
| 4787 | 4788 | result.shrinkRetainingCapacity(Package.Manifest.max_name_len); |
| 4788 | 4789 | |
| 4789 | 4790 | return result.toOwnedSlice(arena); |
| 4790 | 4791 | } |
| 4791 | 4792 | |
| 4793 | test sanitizeExampleName { |
| 4794 | var arena_instance = std.heap.ArenaAllocator.init(std.testing.allocator); |
| 4795 | defer arena_instance.deinit(); |
| 4796 | const arena = arena_instance.allocator(); |
| 4797 | |
| 4798 | try std.testing.expectEqualStrings("foo_bar", try sanitizeExampleName(arena, "foo bar+")); |
| 4799 | try std.testing.expectEqualStrings("foo", try sanitizeExampleName(arena, "")); |
| 4800 | try std.testing.expectEqualStrings("foo", try sanitizeExampleName(arena, "!")); |
| 4801 | try std.testing.expectEqualStrings("a", try sanitizeExampleName(arena, "!a")); |
| 4802 | try std.testing.expectEqualStrings("a_b", try sanitizeExampleName(arena, "a.b!")); |
| 4803 | try std.testing.expectEqualStrings("_01234", try sanitizeExampleName(arena, "01234")); |
| 4804 | } |
| 4805 | |
| 4792 | 4806 | fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void { |
| 4793 | 4807 | dev.check(.build_command); |
| 4794 | 4808 | |