Guest User

Untitled

a guest
Jul 16th, 2025
22
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.71 KB | None | 0 0
  1. // main.zig
  2.  
  3. const Posts = @import("posts");
  4.  
  5. pub fn main() !void {
  6.     const gpa, const is_debug = ...;
  7.  
  8.     const posts = try Posts.init(gpa, "site/posts/");
  9.     defer posts.deinit(gpa);
  10.  
  11.     for (posts.list.items) |*p| {
  12.         p.debug();
  13.     }
  14. }
  15.  
  16. // posts.zig
  17.  
  18. const std = @import("std");
  19.  
  20. const Posts = @This();
  21.  
  22. pub const Post = struct {
  23.     // ...
  24.     pub fn init() Post {
  25.         // ...
  26.     }
  27.     pub fn deinit(self: *Post, allocator: std.mem.Allocator) void {
  28.         allocator.free(self.html);
  29.         self.config.deinit(allocator);
  30.     }
  31.     // ...
  32. };
  33.  
  34. list: std.ArrayListUnmanaged(Post) = .empty,
  35.  
  36. pub fn init(allocator: std.mem.Allocator, dir_path: []const u8) !Posts {
  37.     var self: Posts = .{};
  38.     errdefer self.deinit();
  39.  
  40.     const cwd = std.fs.cwd();
  41.     var dir = try cwd.openDir(dir_path, .{ .iterate = true });
  42.     defer dir.close();
  43.  
  44.     var walker = try dir.walk(allocator);
  45.     defer walker.deinit();
  46.  
  47.     while (try walker.next()) |entry| {
  48.         if (!std.mem.endsWith(u8, entry.path, ".md")) continue;
  49.  
  50.         const full_path = try std.fs.path.join(allocator, &.{ dir_path, entry.path });
  51.         defer allocator.free(full_path);
  52.  
  53.         const buf = try std.fs.cwd().readFileAllocOptions(allocator, full_path, 1024 * 32, null, @alignOf(u8), 0);
  54.         defer allocator.free(buf);
  55.  
  56.         var post = Post.init();
  57.         errdefer post.deinit(); // in case markdown fails and/or it doesn't get added to the list
  58.         try Markdown.parse(allocator, &post, buf);
  59.  
  60.         try self.list.append(allocator, post);
  61.     }
  62.  
  63.     return self;
  64. }
  65.  
  66. pub fn deinit(self: *Posts, allocator: std.mem.Allocator) void {
  67.     for (self.list.items) |*post| {
  68.         post.deinit(allocator);
  69.     }
  70.     self.list.deinit(allocator);
  71. }
  72.  
Advertisement
Add Comment
Please, Sign In to add comment