diff --git a/src/Config.zig b/src/Config.zig index 071c74bb..acb99eca 100644 --- a/src/Config.zig +++ b/src/Config.zig @@ -163,10 +163,14 @@ pub const Serve = struct { common: Common = .{}, }; +pub const DumpFormat = enum { + html, + markdown, +}; + pub const Fetch = struct { url: [:0]const u8, - html: bool = false, - markdown: bool = false, + dump_mode: ?DumpFormat = null, common: Common = .{}, withbase: bool = false, strip: dump.Opts.Strip = .{}, @@ -303,16 +307,12 @@ pub fn printUsageAndExit(self: *const Config, success: bool) void { \\ \\fetch command \\Fetches the specified URL - \\Example: {s} fetch --html https://lightpanda.io/ + \\Example: {s} fetch --dump html https://lightpanda.io/ \\ \\Options: - \\--html Dumps document to stdout as HTML. - \\ Defaults to false. - \\ - \\--dump Alias for --html (deprecated). - \\ - \\--markdown Dumps document to stdout as Markdown. - \\ Defaults to false. + \\--dump Dumps document to stdout. + \\ Argument must be 'html' or 'markdown'. + \\ Defaults to no dump. \\ \\--strip_mode Comma separated list of tag groups to remove from dump \\ the dump. e.g. --strip_mode js,css @@ -412,18 +412,10 @@ fn inferMode(opt: []const u8) ?RunMode { return .fetch; } - if (std.mem.eql(u8, opt, "--html")) { - return .fetch; - } - if (std.mem.eql(u8, opt, "--dump")) { return .fetch; } - if (std.mem.eql(u8, opt, "--markdown")) { - return .fetch; - } - if (std.mem.eql(u8, opt, "--noscript")) { return .fetch; } @@ -560,21 +552,23 @@ fn parseFetchArgs( allocator: Allocator, args: *std.process.ArgIterator, ) !Fetch { - var fetch_html: bool = false; - var fetch_markdown: bool = false; + var dump_mode: ?DumpFormat = null; var withbase: bool = false; var url: ?[:0]const u8 = null; var common: Common = .{}; var strip: dump.Opts.Strip = .{}; while (args.next()) |opt| { - if (std.mem.eql(u8, "--html", opt) or std.mem.eql(u8, "--dump", opt)) { - fetch_html = true; - continue; - } + if (std.mem.eql(u8, "--dump", opt)) { + const str = args.next() orelse { + log.fatal(.app, "missing argument value", .{ .arg = "--dump" }); + return error.InvalidArgument; + }; - if (std.mem.eql(u8, "--markdown", opt)) { - fetch_markdown = true; + dump_mode = std.meta.stringToEnum(DumpFormat, str) orelse { + log.fatal(.app, "invalid option choice", .{ .arg = "--dump", .value = str }); + return error.InvalidArgument; + }; continue; } @@ -641,8 +635,7 @@ fn parseFetchArgs( return .{ .url = url.?, - .html = fetch_html, - .markdown = fetch_markdown, + .dump_mode = dump_mode, .strip = strip, .common = common, .withbase = withbase, diff --git a/src/lightpanda.zig b/src/lightpanda.zig index 1904c3ba..97face0f 100644 --- a/src/lightpanda.zig +++ b/src/lightpanda.zig @@ -37,7 +37,7 @@ const IS_DEBUG = @import("builtin").mode == .Debug; pub const FetchOpts = struct { wait_ms: u32 = 5000, dump: dump.RootOpts, - markdown: bool = false, + dump_mode: ?Config.DumpFormat = null, writer: ?*std.Io.Writer = null, }; pub fn fetch(app: *App, url: [:0]const u8, opts: FetchOpts) !void { @@ -96,10 +96,11 @@ pub fn fetch(app: *App, url: [:0]const u8, opts: FetchOpts) !void { _ = session.wait(opts.wait_ms); const writer = opts.writer orelse return; - if (opts.markdown) { - try markdown.dump(page.window._document.asNode(), .{}, writer, page); - } else { - try dump.root(page.window._document, opts.dump, writer, page); + if (opts.dump_mode) |mode| { + switch (mode) { + .html => try dump.root(page.window._document, opts.dump, writer, page), + .markdown => try markdown.dump(page.window._document.asNode(), .{}, writer, page), + } } try writer.flush(); } diff --git a/src/main.zig b/src/main.zig index 25257533..f9470419 100644 --- a/src/main.zig +++ b/src/main.zig @@ -107,11 +107,11 @@ fn run(allocator: Allocator, main_arena: Allocator) !void { }, .fetch => |opts| { const url = opts.url; - log.debug(.app, "startup", .{ .mode = "fetch", .html = opts.html, .url = url, .snapshot = app.snapshot.fromEmbedded() }); + log.debug(.app, "startup", .{ .mode = "fetch", .dump_mode = opts.dump_mode, .url = url, .snapshot = app.snapshot.fromEmbedded() }); var fetch_opts = lp.FetchOpts{ .wait_ms = 5000, - .markdown = opts.markdown, + .dump_mode = opts.dump_mode, .dump = .{ .strip = opts.strip, .with_base = opts.withbase, @@ -120,7 +120,7 @@ fn run(allocator: Allocator, main_arena: Allocator) !void { var stdout = std.fs.File.stdout(); var writer = stdout.writer(&.{}); - if (opts.html or opts.markdown) { + if (opts.dump_mode != null) { fetch_opts.writer = &writer.interface; }