| ... | @@ -4773,22 +4773,36 @@ fn cmdInit(gpa: Allocator, arena: Allocator, args: []const []const u8) !void { | ... | @@ -4773,22 +4773,36 @@ fn cmdInit(gpa: Allocator, arena: Allocator, args: []const []const u8) !void { |
| 4773 | } | 4773 | } |
| 4774 | | 4774 | |
| 4775 | fn sanitizeExampleName(arena: Allocator, bytes: []const u8) error{OutOfMemory}![]const u8 { | 4775 | fn sanitizeExampleName(arena: Allocator, bytes: []const u8) error{OutOfMemory}![]const u8 { |
| 4776 | if (bytes.len == 0) return "foo"; | | |
| 4777 | var result: std.ArrayListUnmanaged(u8) = .empty; | 4776 | var result: std.ArrayListUnmanaged(u8) = .empty; |
| 4778 | try result.append(arena, switch (bytes[0]) { | 4777 | for (bytes, 0..) |byte, i| switch (byte) { |
| 4779 | '_', 'a'...'z', 'A'...'Z' => |c| c, | 4778 | '0'...'9' => { |
| 4780 | else => '_', | 4779 | if (i == 0) try result.append(arena, '_'); |
| 4781 | }); | 4780 | try result.append(arena, byte); |
| 4782 | for (bytes[1..]) |byte| switch (byte) { | 4781 | }, |
| 4783 | '_', 'a'...'z', 'A'...'Z', '0'...'9' => try result.append(arena, byte), | 4782 | '_', 'a'...'z', 'A'...'Z' => try result.append(arena, byte), |
| | 4783 | '-', '.', ' ' => try result.append(arena, '_'), |
| 4784 | else => continue, | 4784 | else => continue, |
| 4785 | }; | 4785 | }; |
| | 4786 | if (result.items.len == 0) return "foo"; |
| 4786 | if (result.items.len > Package.Manifest.max_name_len) | 4787 | if (result.items.len > Package.Manifest.max_name_len) |
| 4787 | result.shrinkRetainingCapacity(Package.Manifest.max_name_len); | 4788 | result.shrinkRetainingCapacity(Package.Manifest.max_name_len); |
| 4788 | | 4789 | |
| 4789 | return result.toOwnedSlice(arena); | 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 | fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void { | 4806 | fn cmdBuild(gpa: Allocator, arena: Allocator, args: []const []const u8) !void { |
| 4793 | dev.check(.build_command); | 4807 | dev.check(.build_command); |
| 4794 | | 4808 | |