| ... | ... | @@ -499,7 +499,7 @@ pub const Target = union(enum) { |
| 499 | 499 | pub fn parseArchSub(text: []const u8) ParseArchSubError!Arch { |
| 500 | 500 | const info = @typeInfo(Arch); |
| 501 | 501 | inline for (info.Union.fields) |field| { |
| 502 | | if (mem.eql(u8, text, field.name)) { |
| 502 | if (text.len >= field.name.len and mem.eql(u8, text[0..field.name.len], field.name)) { |
| 503 | 503 | if (field.field_type == void) { |
| 504 | 504 | return @as(Arch, @field(Arch, field.name)); |
| 505 | 505 | } else { |
| ... | ... | @@ -517,6 +517,31 @@ pub const Target = union(enum) { |
| 517 | 517 | return error.UnknownArchitecture; |
| 518 | 518 | } |
| 519 | 519 | |
| 520 | pub fn parseArchTag(text: []const u8) ParseArchSubError!@TagType(Arch) { |
| 521 | const info = @typeInfo(Arch); |
| 522 | inline for (info.Union.fields) |field| { |
| 523 | if (text.len >= field.name.len and mem.eql(u8, text[0..field.name.len], field.name)) { |
| 524 | if (text.len == field.name.len) return @as(@TagType(Arch), @field(Arch, field.name)); |
| 525 | |
| 526 | if (field.field_type == void) { |
| 527 | return error.UnknownArchitecture; |
| 528 | } |
| 529 | |
| 530 | const sub_info = @typeInfo(field.field_type); |
| 531 | inline for (sub_info.Enum.fields) |sub_field| { |
| 532 | const combined = field.name ++ sub_field.name; |
| 533 | if (mem.eql(u8, text, combined)) { |
| 534 | return @as(@TagType(Arch), @field(Arch, field.name)); |
| 535 | } |
| 536 | } |
| 537 | |
| 538 | return error.UnknownSubArchitecture; |
| 539 | } |
| 540 | } |
| 541 | |
| 542 | return error.UnknownArchitecture; |
| 543 | } |
| 544 | |
| 520 | 545 | pub fn parseOs(text: []const u8) !Os { |
| 521 | 546 | const info = @typeInfo(Os); |
| 522 | 547 | inline for (info.Enum.fields) |field| { |