Skip to content

Commit

Permalink
refactor: Make each line of package parsing less cluttered
Browse files Browse the repository at this point in the history
  • Loading branch information
Hejsil committed Dec 20, 2024
1 parent 3297d0c commit 3a8436e
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 37 deletions.
44 changes: 23 additions & 21 deletions src/InstalledPackages.zig
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,20 @@ pub fn parseFromFile(options: struct {
}

pub fn parse(gpa: std.mem.Allocator, string: []const u8) !InstalledPackages {
var arena_state = std.heap.ArenaAllocator.init(gpa);
errdefer arena_state.deinit();
const arena = arena_state.allocator();
var packages = InstalledPackages{
.arena = std.heap.ArenaAllocator.init(gpa),
.packages = std.StringArrayHashMapUnmanaged(InstalledPackage){},
.file = null,
};
errdefer packages.deinit();

try packages.parseInto(string);
return packages;
}

var packages = std.StringArrayHashMapUnmanaged(InstalledPackage){};
errdefer packages.deinit(gpa);
pub fn parseInto(packages: *InstalledPackages, string: []const u8) !void {
const gpa = packages.arena.child_allocator;
const arena = packages.arena.allocator();

var parser = ini.Parser.init(string);
var parsed = parser.next();
Expand All @@ -66,11 +74,7 @@ pub fn parse(gpa: std.mem.Allocator, string: []const u8) !InstalledPackages {
.comment => {},
.section => break,
.property, .invalid => return error.InvalidPackagesIni,
.end => return .{
.arena = arena_state,
.packages = packages,
.file = null,
},
.end => return,
};

const PackageField = std.meta.FieldEnum(InstalledPackage);
Expand All @@ -90,28 +94,26 @@ pub fn parse(gpa: std.mem.Allocator, string: []const u8) !InstalledPackages {
package.location = try location.toOwnedSlice();

const section = parsed.section(string).?;
const entry = try packages.getOrPutValue(gpa, section.name, .{});
const entry = try packages.packages.getOrPutValue(gpa, section.name, .{});
if (!entry.found_existing)
entry.key_ptr.* = try arena.dupe(u8, section.name);

package = entry.value_ptr;
try location.appendSlice(package.location);
},
.property => switch (try stringToEnum(PackageField, parsed.property(string).?.name)) {
.version => package.version = try arena.dupe(u8, parsed.property(string).?.value),
.location => try location.append(try arena.dupe(u8, parsed.property(string).?.value)),
.property => {
const prop = parsed.property(string).?;
const value = try arena.dupe(u8, prop.value);
switch (try stringToEnum(PackageField, prop.name)) {
.version => package.version = value,
.location => try location.append(value),
}
},
.end => {
package.location = try location.toOwnedSlice();
break;
return;
},
};

return .{
.arena = arena_state,
.packages = packages,
.file = null,
};
}

fn stringToEnum(comptime T: type, str: []const u8) !T {
Expand Down
36 changes: 20 additions & 16 deletions src/Packages.zig
Original file line number Diff line number Diff line change
Expand Up @@ -169,22 +169,26 @@ pub fn parseInto(packages: *Packages, string: []const u8) !void {
try install_lib.appendSlice(package.linux_x86_64.install_lib);
try install_share.appendSlice(package.linux_x86_64.install_share);
},
.property => switch (package_field) {
.info => switch (try stringToEnum(InfoField, parsed.property(string).?.name)) {
.version => package.info.version = try arena.dupe(u8, parsed.property(string).?.value),
.description => package.info.description = try arena.dupe(u8, parsed.property(string).?.value),
.donate => try donate.append(try arena.dupe(u8, parsed.property(string).?.value)),
},
.update => switch (try stringToEnum(UpdateField, parsed.property(string).?.name)) {
.github => package.update.github = try arena.dupe(u8, parsed.property(string).?.value),
},
.linux_x86_64 => switch (try stringToEnum(ArchField, parsed.property(string).?.name)) {
.url => package.linux_x86_64.url = try arena.dupe(u8, parsed.property(string).?.value),
.hash => package.linux_x86_64.hash = try arena.dupe(u8, parsed.property(string).?.value),
.install_bin => try install_bin.append(try arena.dupe(u8, parsed.property(string).?.value)),
.install_lib => try install_lib.append(try arena.dupe(u8, parsed.property(string).?.value)),
.install_share => try install_share.append(try arena.dupe(u8, parsed.property(string).?.value)),
},
.property => {
const prop = parsed.property(string).?;
const value = try arena.dupe(u8, prop.value);
switch (package_field) {
.info => switch (try stringToEnum(InfoField, prop.name)) {
.version => package.info.version = value,
.description => package.info.description = value,
.donate => try donate.append(value),
},
.update => switch (try stringToEnum(UpdateField, prop.name)) {
.github => package.update.github = value,
},
.linux_x86_64 => switch (try stringToEnum(ArchField, prop.name)) {
.url => package.linux_x86_64.url = value,
.hash => package.linux_x86_64.hash = value,
.install_bin => try install_bin.append(value),
.install_lib => try install_lib.append(value),
.install_share => try install_share.append(value),
},
}
},
.end => {
package.info.donate = try donate.toOwnedSlice();
Expand Down

0 comments on commit 3a8436e

Please sign in to comment.