const std = @import("std"); const datetime = @import("datetime"); const helper = @import("helper.zig"); const Data = @import("Data.zig"); const Makko = @import("Makko.zig"); const FeedGenerator = @This(); name: []const u8, func: fn (Makko, data: Data, writer: anytype) anyerror!void, pub const generator_list = [_]FeedGenerator{ .{ .func = html, .name = "html" }, .{ .func = rss, .name = "rss" }, .{ .func = atom, .name = "atom" }, }; fn html(state: Makko, data: Data, writer: anytype) !void { const allocator = state.allocator; const json_data = try helper.valueToJson(allocator, data); defer json_data.deinit(); if (state.templates.feed == null) return error.MissingTemplate; const first_pass = try helper.template( allocator, state.templates.feed.?, json_data.value, ); defer allocator.free(first_pass); const second_pass = try helper.template( allocator, first_pass, json_data.value, ); defer allocator.free(second_pass); try writer.writeAll(second_pass); } fn rss(state: Makko, data: Data, writer: anytype) !void { const allocator = state.allocator; const website = data.website; const general_dt = datetime.datetime.Datetime.now(); const now_http = try general_dt.formatHttp(allocator); defer allocator.free(now_http); try writer.print( \\ \\ \\ \\ {s} \\ {s} \\ {s} \\ makko \\ {s} \\ , .{ website.title, website.url, website.description, now_http }, ); for (data.posts.?) |post| { if (post.is_secret) continue; const post_link = try std.mem.concat( allocator, u8, &[_][]const u8{ website.url, "/", post.url }, ); defer allocator.free(post_link); const dt = datetime.datetime.Datetime.fromTimestamp(post.created.raw); const pub_date = try dt.formatHttp(allocator); defer allocator.free(pub_date); try writer.print( \\ \\ {s} \\ {s} \\ {s} \\ {s} \\ {s} \\ \\ , .{ post.title, post_link, pub_date, post.author, post.description }, ); } try writer.writeAll( \\ \\ \\ ); } fn atom(state: Makko, data: Data, writer: anytype) !void { const allocator = state.allocator; const now = datetime.datetime.Datetime.now(); const now_iso8601 = try now.formatISO8601(allocator, false); defer allocator.free(now_iso8601); const website = data.website; try writer.print( \\ \\ \\ {s} \\ \\ {s} \\ {s} \\ makko \\ , .{ website.title, website.url, now_iso8601, website.url }, ); for (data.posts.?) |post| { if (post.is_secret) continue; const post_link = try std.mem.concat( allocator, u8, &[_][]const u8{ website.url, "/", post.url }, ); defer allocator.free(post_link); const upd_dt = datetime.datetime.Datetime.fromTimestamp(post.updated.raw); const upd_iso8601 = try upd_dt.formatISO8601(allocator, false); defer state.allocator.free(upd_iso8601); const pub_dt = datetime.datetime.Datetime.fromTimestamp(post.created.raw); const pub_iso8601 = try pub_dt.formatISO8601(allocator, false); defer state.allocator.free(pub_iso8601); try writer.print( \\ \\ {s} \\ \\ {s} \\ {s} \\ {s} \\ {s} \\ {s} \\ \\ , .{ post.title, post_link, post_link, // use URL as unique ID pub_iso8601, upd_iso8601, post.author, post.description, }, ); } try writer.writeAll("\n"); }