62 lines
1.8 KiB
Zig
62 lines
1.8 KiB
Zig
const std = @import("std");
|
|
|
|
const Class = @import("Class.zig");
|
|
|
|
const Formatter = @import("Formatter.zig");
|
|
|
|
pub fn main(init: std.process.Init) !void {
|
|
const io = init.io;
|
|
const allocator = init.gpa;
|
|
|
|
var args = try init.minimal.args.iterateAllocator(init.arena.allocator());
|
|
defer args.deinit();
|
|
|
|
var stderr_writer: std.Io.File.Writer = .init(.stderr(), io, &.{});
|
|
const stderr = &stderr_writer.interface;
|
|
|
|
var stdout_buf: [1024]u8 = undefined;
|
|
var stdout_writer: std.Io.File.Writer = .init(.stdout(), io, &stdout_buf);
|
|
const stdout = &stdout_writer.interface;
|
|
|
|
std.debug.assert(args.skip());
|
|
const file_path = if (args.next()) |fp| fp else {
|
|
try stderr.writeAll("No file argument provided.\n");
|
|
return;
|
|
};
|
|
|
|
const file = std.Io.Dir.cwd().openFile(io, file_path, .{}) catch |err| switch (err) {
|
|
error.FileNotFound => {
|
|
try stderr.writeAll("File not found.\n");
|
|
return;
|
|
},
|
|
error.IsDir => {
|
|
try stderr.writeAll("Path is a directory.\n");
|
|
return;
|
|
},
|
|
else => return err,
|
|
};
|
|
defer file.close(io);
|
|
|
|
var file_buf: [1024]u8 = undefined;
|
|
var file_reader = file.reader(io, &file_buf);
|
|
const reader = &file_reader.interface;
|
|
|
|
var class = Class.parse(reader, allocator) catch |err| switch (err) {
|
|
error.InvalidMagicNumber => {
|
|
try stderr.writeAll("Invalid magic number.\n");
|
|
return;
|
|
},
|
|
error.InvalidTag => {
|
|
try stderr.writeAll("Unrecognized tag type.\n");
|
|
return;
|
|
},
|
|
else => return err,
|
|
};
|
|
defer class.deinit();
|
|
|
|
var indented_formatter: Formatter.IndentedFormatter = .init(stdout);
|
|
const formatter = &indented_formatter.interface;
|
|
try class.acceptFormatter(formatter);
|
|
|
|
try stdout.flush();
|
|
}
|