Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions mise.toml
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
[tools]
zig = "0.14.1"
zls = "0.14.0"
zig = "0.15.2"
zls = "0.15.1"

[tasks.main]
run = "zig run src/main.zig -- $@"

[tasks.merge]
run = "zig run src/merge.zig"
run = "zig run src/merger.zig"

[tasks.unit]
run = "zig test src/parser.zig"

[tasks.e2e]
run = "zig test --test-filter e2e src/parser.e2e.zig"
run = [
"zig test --test-filter e2e src/merger.e2e.zig",
# "zig test --test-filter e2e src/parser.e2e.zig",
]

[tasks.tests]
depends = ["unit", "e2e"]
4 changes: 4 additions & 0 deletions src/ast/document.zig
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,8 @@ pub const Document = struct {
}
self.definitions.deinit();
}

pub fn deinitMergedDocument(self: Document) void {
self.definitions.deinit();
}
};
18 changes: 12 additions & 6 deletions src/merge.zig
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ pub const Merger = struct {
return MergeError.UnexpectedMemoryError;
},
else => return std.fmt.allocPrint(self.allocator, "unknownDefinition_{s}", .{@tagName(definition)}) catch
return MergeError.UnexpectedMemoryError,
MergeError.UnexpectedMemoryError,
}
}

Expand All @@ -48,7 +48,13 @@ pub const Merger = struct {
defer similarDefinitionsMap.deinit();

var similarDefinitionsNames = ArrayList([]const u8).init(self.allocator);
defer similarDefinitionsNames.deinit();

defer {
for (similarDefinitionsNames.items) |definitionName| {
self.allocator.free(definitionName);
}
similarDefinitionsNames.deinit();
}

for (documents) |document| {
for (document.definitions.items) |definition| {
Expand Down Expand Up @@ -81,15 +87,15 @@ pub const Merger = struct {

switch (similarDefinitions.items[0]) {
.objectTypeDefinition, .objectTypeExtension => {
var unionDefinition = ArrayList(ObjectTypeDefinition).init(self.allocator);
var objectTypeDefinitions = ArrayList(ObjectTypeDefinition).init(self.allocator);
for (similarDefinitions.items) |definition| {
unionDefinition.append(switch (definition) {
objectTypeDefinitions.append(switch (definition) {
.objectTypeDefinition => |def| def,
.objectTypeExtension => |ext| ObjectTypeDefinition.fromExtension(ext),
else => unreachable,
}) catch return MergeError.UnexpectedMemoryError;
}
const mergedDefinition = try mergeObjectTypeDefinitions(self, unionDefinition.toOwnedSlice() catch return MergeError.UnexpectedMemoryError);
const mergedDefinition = try mergeObjectTypeDefinitions(self, objectTypeDefinitions.toOwnedSlice() catch return MergeError.UnexpectedMemoryError);
mergedDefinitions.append(ExecutableDefinition{ .objectTypeDefinition = mergedDefinition }) catch return MergeError.UnexpectedMemoryError;
},
.operationDefinition => {
Expand Down Expand Up @@ -149,7 +155,7 @@ fn mergeObjectTypeDefinitions(self: *Merger, objectTypeDefinitions: []const Obje

pub fn main() !void {
const alloc = std.heap.page_allocator;
const typeDefsDir = "graphql-definitions";
const typeDefsDir = "tests/e2e-merge";

var dir = try std.fs.cwd().openDir(typeDefsDir, .{ .iterate = true });
defer dir.close();
Expand Down
77 changes: 77 additions & 0 deletions src/merger.e2e.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
const std = @import("std");
const testing = @import("std").testing;
const Parser = @import("parser.zig").Parser;
const Merger = @import("merge.zig").Merger;
const getFileContent = @import("utils/utils.zig").getFileContent;
const ArrayList = std.ArrayList;
const Document = @import("ast/document.zig").Document;
const Printer = @import("printer.zig").Printer;
const normalizeLineEndings = @import("utils/utils.zig").normalizeLineEndings;

test "e2e-merge" {
const alloc = std.testing.allocator;
const typeDefsDir = "tests/e2e-merge";

var dir = try std.fs.cwd().openDir(typeDefsDir, .{ .iterate = true });
defer dir.close();

var filesToParse = ArrayList([]const u8).init(alloc);
defer {
for (filesToParse.items) |path| {
alloc.free(path);
}
filesToParse.deinit();
}

var iterator = dir.iterate();
while (try iterator.next()) |entry| {
if (entry.kind == .file) {
const path = try std.fmt.allocPrint(alloc, "{s}/{s}", .{ typeDefsDir, entry.name });
try filesToParse.append(path);
}
}

var documents = ArrayList(Document).init(alloc);
defer {
for (documents.items) |document| {
document.deinit();
}
documents.deinit();
}

for (filesToParse.items) |file| {
const content = getFileContent(file, alloc) catch return;
defer alloc.free(content);

var parser = try Parser.initFromBuffer(alloc, content);
defer parser.deinit();

const document = try parser.parse();
documents.append(document) catch return;
}

var merger = Merger.init(alloc);
const documentsSlice = try documents.toOwnedSlice();
defer {
for (documentsSlice) |document| {
document.deinit();
}
alloc.free(documentsSlice);
}
const mergedDocument = try merger.mergeIntoSingleDocument(documentsSlice);
defer mergedDocument.deinitMergedDocument();

var printer = try Printer.init(alloc, mergedDocument);
const gql = try printer.getGql();
defer alloc.free(gql);

const expectedText = try getFileContent("tests/merger.e2e.snapshot.graphql", testing.allocator);
defer testing.allocator.free(expectedText);

const normalizedText = normalizeLineEndings(testing.allocator, gql);
defer testing.allocator.free(normalizedText);
const normalizedExpectedText = normalizeLineEndings(testing.allocator, expectedText);
defer testing.allocator.free(normalizedExpectedText);

try testing.expectEqualStrings(normalizedExpectedText, normalizedText);
}
7 changes: 7 additions & 0 deletions src/root.zig
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
const std = @import("std");
const Merger = @import("merge.zig").Merger;
const Parser = @import("parser.zig").Parser;

pub const merger = Merger;
pub const parser = Parser;

test {
std.testing.refAllDecls(@This());
}
12 changes: 12 additions & 0 deletions tests/e2e-merge/base.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
"""
Nice object
"""
type Object {
#some comment
name: String!
}

type Query {
hello: String!
giveMeAnObject: Object!
}
9 changes: 9 additions & 0 deletions tests/e2e-merge/extend.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
extend type Query {
"this is a new field"
world: String!
}

#some comment
extend type Object {
material: String!
}
3 changes: 3 additions & 0 deletions tests/e2e-merge/query.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
query SomeQuery {
hello
}
14 changes: 14 additions & 0 deletions tests/merger.e2e.snapshot.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
"""
Nice object
"""
type Object {
name: String!
material: String!
}

type Query {
hello: String!
giveMeAnObject: Object!
"this is a new field"
world: String!
}
Loading