@@ -11,34 +11,57 @@ This is alpha software so expect bugs.
1111.dependencies = .{
1212 ...
1313.zeal = .{
14- .url = "https://github.com/earthfail/zeal/archive/v0.0.1.tar.gz",
14+ .url = "https://github.com/earthfail/zeal/archive/v0.0.2.tar.gz",
15+ .hash = "1220302efc8baa22fa6d6d1c0269bef215f5cf1b614cbe2db9b4bcf9dcc6db514421",
1516 }
1617 ...
1718}
1819```
19- then run ` zig build ` to get a hash mismatch. Add this hash to ` .hash `
20- field next to ` .url ` field above.
21202 . add ` zeal ` to ` build.zig ` :
2221
2322``` zig
2423pub fn build(b: *std.Build) void {
2524 const target = b.standardTargetOptions(.{});
2625 const optimize = b.standardOptimizeOption(.{});
27- ....
26+ // define exe for your use case
27+ const exe = b.addExecutable(.{
28+ .name = "project-name",
29+ .root_source_file = .{ .path = "src/main.zig" },
30+ .target = target,
31+ .optimize = optimize,
32+ });
33+ // add zeal as dependency
2834 const zeal = b.dependency("zeal", .{
2935 .optimize = optimize,
3036 .target = target,
3137 });
32- // for exe, lib, tests, etc.
3338 exe.addModule("zeal", zeal.module("zeal"));
34- ....
39+ b.installArtifact(exe);
40+ // rest of build.zig
41+
3542```
3643
37443 . import in your code:
3845``` zig
46+ const zeal = @import("zeal");
47+ ```
48+
49+ ## Example
3950
51+ ``` zig
4052const std = @import("std");
53+ const mem = std.mem;
54+ const log = std.log;
55+ const expect = std.testing.expect;
4156const zeal = @import("zeal");
57+ const parser = zeal.parser;
58+ const EdnReader = zeal.EdnReader;
59+ const Edn = zeal.Edn;
60+ const TagElement = zeal.TagElement;
61+ const TagError = zeal.TagError;
62+
63+ /// simple function to read a line from user
64+ /// taken from [ziglearn.org](https://ziglearn.org/chapter-2/#readers-and-writers) by [Sobeston](https://github.com/Sobeston)
4265fn nextLine(reader: anytype, buffer: []u8) !?[]const u8 {
4366 var line = (try reader.readUntilDelimiterOrEof(
4467 buffer,
@@ -51,6 +74,7 @@ fn nextLine(reader: anytype, buffer: []u8) !?[]const u8 {
5174 return line;
5275 }
5376}
77+ // read edn from stdin
5478fn repl_edn() !void {
5579 var gpa = std.heap.GeneralPurposeAllocator(
5680 //.{ .verbose_log = true, .retain_metadata = true }
@@ -67,6 +91,7 @@ fn repl_edn() !void {
6791
6892 const stdout = std.io.getStdOut().writer();
6993 const stdin = std.io.getStdIn().reader();
94+ // buffer to hold user input
7095 var buffer: [2000]u8 = undefined;
7196 try stdout.writeAll("edn is an extensible data notation\n");
7297 while (true) {
@@ -77,22 +102,24 @@ fn repl_edn() !void {
77102 std.debug.print("gpa detected leaks with input '{s}'\n", .{input});
78103 }
79104 }
80- // const allocator = arena.allocator();
105+
106+ // define ednreader
81107 var reader = EdnReader.init(g_allocator, input);
108+ // initialize readers to tagged elements
82109 reader.data_readers = std.StringHashMap(parser.TagHandler).init(g_allocator);
110+ // define reader for #inst elements.
83111 try reader.data_readers.?.put("inst", edn_to_inst);
84112 defer reader.deinit();
85- // if (EdnReader.readEdn(allocator, &iter)) |edn| {
113+
86114 if (reader.readEdn()) |edn| {
87- log.info("address {*} type {s}, value:", .{ edn, @tagName(edn.*) });
88- // log.info("edn from log {}\n",.{edn.*});
89115 // try stdout.print("{}\n", .{edn.*});
116+ // convert edn to []const u8
117+ defer edn.deinit(g_allocator);
90118 const serialize = try parser.Edn.serialize(edn.*, g_allocator);
91119 defer g_allocator.free(serialize);
92120
93121 try stdout.print("{s}\n", .{serialize});
94122
95- edn.deinit(g_allocator);
96123 } else |err| {
97124 try stdout.print("got error parsing input {}. Salam\n", .{err});
98125 // break;
@@ -101,5 +128,39 @@ fn repl_edn() !void {
101128 }
102129 try stdout.print("finished\n", .{});
103130}
131+ /// given a integer in Edn form, returns a tagged element with that integer plus ten
132+ fn edn_to_inst(allocator: mem.Allocator, edn: Edn) parser.TagError!*TagElement {
133+ switch (edn) {
134+ .integer => |i| {
135+ var i_p = try allocator.create(@TypeOf(i));
136+ i_p.* = i + 10;
137+ var ele = try allocator.create(TagElement);
138+ ele.pointer = @intFromPtr(i_p);
139+ ele.deinit = inst_deinit;
140+ ele.serialize = inst_serialize;
141+ return ele;
142+ },
143+ else => {
144+ return TagError.TypeNotSupported;
145+ },
146+ }
147+ }
148+ fn inst_deinit(pointer: usize, allocator: mem.Allocator) void {
149+ const i_p: *i64 = @ptrFromInt(pointer);
150+ allocator.destroy(i_p);
151+ }
152+ // specifiy how to convert data back to string
153+ fn inst_serialize(pointer: usize, allocator: mem.Allocator) parser.SerializeError![]const u8 {
154+ const i_p: *i64 = @ptrFromInt(pointer);
155+ var buffer = std.ArrayList(u8).init(allocator);
156+ errdefer buffer.deinit();
157+
158+ const writer = buffer.writer();
159+ writer.print("{d}", .{i_p.*}) catch return parser.SerializeError.InvalidData;
160+ return buffer.toOwnedSlice();
161+ }
162+ pub fn main() !void {
163+ try repl_edn();
164+ }
104165
105166```
0 commit comments