#need help with .zon (not build.zig.zon) parsing

1 messages · Page 1 of 1 (latest)

frank vortex
#

I'm trying to load a config file from my assets using a .zon file, and while I was able to figure out what to use, I do not know how to use it I have tried

const std = @import("std");

pub const Config = struct {
    name: [:0]u8,
    resolution: @Vector(2, u16),
    aspect_ratio_mode: u4,
    resolution_mode: u4,
    version: [:0]u8,

    pub fn get_config(alloc: std.mem.Allocator) !Config {
        const code = try std.fs.cwd().readFileAlloc(alloc, "assets/.project.zon", 1000000000);
        return try std.zon.parse.fromSlice(Config, alloc, @ptrCast(code), null, .{ .free_on_error = true });
    }
};

and

const std = @import("std");

pub const Config = struct {
    name: [:0]u8,
    resolution: @Vector(2, u16),
    aspect_ratio_mode: u4,
    resolution_mode: u4,
    version: [:0]u8,

    pub fn get_config(alloc: std.mem.Allocator) !Config {
        return try std.zon.parse.fromSlice(Config, alloc, "assets/.project.zon", null, .{ .free_on_error = true });
    }
};

I know that I'm doing something wrong, but I'm not sure what I'm doing wrong since I can't find any documentation

#

both cases result in runtime errors

frank vortex
#

/home/oreboat/.config/Code - OSS/User/globalStorage/ziglang.vscode-zig/zig/x86_64-linux-0.15.2/lib/std/zon/parse.zig:322:9: 0x1270a8b in fromZoirNode__anon_25762 (std.zig)
return error.ParseZon;
^
/home/oreboat/.config/Code - OSS/User/globalStorage/ziglang.vscode-zig/zig/x86_64-linux-0.15.2/lib/std/zon/parse.zig:300:5: 0x1243d2b in fromZoir__anon_24724 (std.zig)
return fromZoirNode(T, gpa, ast, zoir, .root, diag, options);
^
/home/oreboat/.config/Code - OSS/User/globalStorage/ziglang.vscode-zig/zig/x86_64-linux-0.15.2/lib/std/zon/parse.zig:288:5: 0x1238ec5 in fromSlice__anon_23488 (std.zig)
return fromZoir(T, gpa, ast, zoir, diag, options);
^
/home/oreboat/projects/Project-Yurimech/engine/core/config/config.zig:11:16: 0x122fdb9 in get_config (app.zig)
return try std.zon.parse.fromSlice(Config, alloc, "assets/.project.zon", null, .{ .free_on_error = true });
^
/home/oreboat/projects/Project-Yurimech/engine/plugins/renderer/raylib/raylib_plugin.zig:7:24: 0x1230142 in init (default_plugins.zig)
const config = try Config.get_config(app.alloc);
^
/home/oreboat/projects/Project-Yurimech/engine/core/app.zig:50:9: 0x12302f6 in addPlugin__anon_23075 (app.zig)
try plugin.init(self);
^
/home/oreboat/projects/Project-Yurimech/engine/plugins/renderer/renderer_plugin.zig:14:9: 0x12303c4 in init (default_plugins.zig)
try switch (renderer) {
^
/home/oreboat/projects/Project-Yurimech/engine/core/app.zig:50:9: 0x1230456 in addPlugin__anon_23054 (app.zig)
try plugin.init(self);
^
/home/oreboat/projects/Project-Yurimech/engine/plugins/default_plugins.zig:11:9: 0x1230554 in init (default_plugins.zig)
try app.addPlugin(@import("renderer/renderer_plugin.zig").RendererPlugin);
^
/home/oreboat/projects/Project-Yurimech/engine/core/app.zig:50:9: 0x12305f6 in addPlugin__anon_22639 (app.zig)
try plugin.init(self);
^
/home/oreboat/projects/Project-Yurimech/main/main.zig:8:5: 0x1236736 in main (main.zig)
try app.addPlugin(engine.DefaultPlugins);

unkempt geode
#

can you print out the contents of code

#

using std.debug.print or something

frank vortex
#
.{
    .name = "Project-Yurimech",
    .resolution = .{ 1280, 720 },
    .aspect_ratio_mode = 0,
    .resolution_mode = 0,
    .version = "0.0.0",
}
unkempt geode
#
var diag: Diagnostics = .{};
return std.zon.parse.fromSlice(Config, alloc, @ptrCast(code), &diag, .{ .free_on_error = true }) catch |err| {
  std.debug.print("err: {f}\n", .{diag});  
  return err;
}
frank vortex
#

right, well at least that gave me a new error

/home/oreboat/.config/Code - OSS/User/globalStorage/ziglang.vscode-zig/zig/x86_64-linux-0.15.2/lib/std/zon/parse.zig:643:13: 0x1377359 in parseString__anon_45271 (std.zig)
            return error.WrongType;
            ^
/home/oreboat/.config/Code - OSS/User/globalStorage/ziglang.vscode-zig/zig/x86_64-linux-0.15.2/lib/std/zon/parse.zig:611:32: 0x136d31b in parseSlicePointer__anon_44121 (std.zig)
            .string_literal => return self.parseString(T, node),
pearl dune
#

can it parse into mutable strings? does changing your Config's fields to [:0]const u8 work?

unkempt geode
#
        if (pointer.child != u8 or
            pointer.size != .slice or
            !pointer.is_const or
            (pointer.sentinel() != null and pointer.sentinel() != 0) or
            pointer.alignment != 1)
        {
            return error.WrongType;
        }
#

yeah looks like it can't

frank vortex
#

okay, so I changed the scene type and that appears to have fixed it

const std = @import("std");

pub const Config = struct {
    name: []const u8,
    resolution: @Vector(2, u16),
    aspect_ratio_mode: u4,
    resolution_mode: u4,
    version: []const u8,

    pub fn get_config(alloc: std.mem.Allocator) !Config {
        const code = try std.fs.cwd().readFileAlloc(alloc, "assets/.project.zon", 1000000000);
        std.debug.print("{s}", .{code});
        var diag: std.zon.parse.Diagnostics = .{};
        return std.zon.parse.fromSlice(Config, alloc, @ptrCast(code), &diag, .{ .free_on_error = true }) catch |err| {
            std.debug.print("err: {f}\n", .{diag});
            return err;
        };
    }
};
#

if there's one thing I think Zig needs to work on, it's that there are like 3 different types of string

pearl dune
tawdry kelp
#

@pearl dune @frank vortex does zig support parsing zon into arraylists?

I'm trying to parse this zon file:

.{
  .last_updated = 20434,
  .topics = .{
    .{
      .name = "Zettelkasten",
      .last_viewed = 20435,
      .strength = 2,
      .retention = 55
    },
    .{
      .name = "Something",
      .last_viewed = 20437,
      .strength = 2,
      .retention = 60.65
    }
  }
}
const Topic = struct {
    name: []const u8,
    last_viewed: u47,
    strength: f32 = 2,
    retention: f64 = 100.00,
// other code

const Memory = struct {
    last_updated: u47, // format: days since epoch
    topics: List(Topic),
// other code

        var diag: std.zon.parse.Diagnostics = .{};
        const parsed = try std.zon.parse.fromSlice(Memory, allocator, @ptrCast(file), &diag, .{ .free_on_error = true });

but i get zon ParseError