Skip to content

Commit 37fea76

Browse files
committed
publish version 0.0.2 of zeal
1 parent fdf388a commit 37fea76

File tree

3 files changed

+78
-20
lines changed

3 files changed

+78
-20
lines changed

README.md

Lines changed: 72 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
2120
2. add `zeal` to `build.zig`:
2221

2322
``` zig
2423
pub 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

3744
3. import in your code:
3845
``` zig
46+
const zeal = @import("zeal");
47+
```
48+
49+
## Example
3950

51+
``` zig
4052
const std = @import("std");
53+
const mem = std.mem;
54+
const log = std.log;
55+
const expect = std.testing.expect;
4156
const 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)
4265
fn 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
5478
fn 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
```

build.zig

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,20 @@ pub fn build(b: *std.Build) void {
2222
.target = target,
2323
});
2424

25-
const zeal = b.addModule("zeal-mod", .{
25+
_ = b.addModule("zeal", .{
2626
.source_file = .{ .path = "src/edn.zig"},
2727
.dependencies = &.{
28+
// zig uses this information to add ziglyph when adding zeal
2829
.{
2930
.name = "ziglyph",
3031
.module = ziglyph.module("ziglyph"),
3132
},
3233
},
3334
});
3435

36+
//// useful if I want to create a static library
3537
// const lib = b.addStaticLibrary(.{
38+
// // library file name is "lib[name].a"
3639
// .name = "zeal-lib",
3740
// .root_source_file = .{ .path = "src/edn.zig"},
3841
// .target = target,
@@ -42,6 +45,7 @@ pub fn build(b: *std.Build) void {
4245
// b.installArtifact(lib);
4346

4447
const exe = b.addExecutable(.{
48+
// executable file name is "[name]"
4549
.name = "edn-parser",
4650
// In this case the main source file is merely a path, however, in more
4751
// complicated build scripts, this could be a generated file.

build.zig.zon

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,6 @@
99
}
1010
},
1111
.paths = .{
12-
"LICENSE",
13-
"README.md",
14-
"build.zig",
15-
"build.zig.zon",
16-
"history.txt",
17-
"examples/",
18-
"includes/",
19-
"src/",
12+
"src",
2013
},
2114
}

0 commit comments

Comments
 (0)