diff --git a/build.zig.zon b/build.zig.zon index 52d9932..5cc6c82 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -14,8 +14,8 @@ .hash = "httpz-0.0.0-PNVzrBtMBwAPcQx3mNEgat3Xbsynw-eIC9SmOX5M9XtP", }, .zfin = .{ - .url = "git+https://git.lerch.org/lobo/zfin#5052492ffd49ebdc11b209da1b86bbaf7d365e5e", - .hash = "zfin-0.0.0-J-B21ryaDACsjkyET8s_NhF0W745-Qoc_fj9VM8Z-Ngx", + .url = "git+https://git.lerch.org/lobo/zfin#ecadfb492d8730c3226c738b6cb63e688d7f89dc", + .hash = "zfin-0.0.0-J-B21tqwDACaht3HgLXCYDXJsyZsMwzncEKeX2JYiiJG", }, }, } diff --git a/src/main.zig b/src/main.zig index 4a0eeb9..f8916ef 100644 --- a/src/main.zig +++ b/src/main.zig @@ -175,8 +175,8 @@ fn handleReturns(app: *App, req: *httpz.Request, res: *httpz.Response) !void { const vol_term: ?u8 = if (v10y != null) 10 else if (v5y != null) 5 else if (v3y != null) 3 else if (v1y != null) 1 else null; // Total returns: adj_close is the primary source (accounts for splits + dividends). - // Dividend-reinvestment is only used as fallback when adj_close returns null - // (e.g. candle history too short for stable-NAV funds like money markets). + // Dividend-reinvestment only fills gaps where adj_close returns null + // (e.g. stable-NAV funds with short candle history). var t1y: ?f64 = p1y; var t3y: ?f64 = p3y; var t5y: ?f64 = p5y; @@ -485,6 +485,14 @@ fn refresh(allocator: std.mem.Allocator) !void { } else |err| { try stdout.print("candles FAILED ({s})", .{@errorName(err)}); sym_ok = false; + if (err == zfin.DataError.TransientError or err == zfin.DataError.AuthError) { + const reason = if (err == zfin.DataError.AuthError) "auth failure" else "transient provider failure"; + try stdout.print("\n", .{}); + try stdout.print("\nStopping refresh: {s}\n", .{reason}); + try stdout.print("Refresh aborted: {d} ok, {d} failed\n", .{ success_count, fail_count + 1 }); + try stdout.flush(); + return error.RefreshFailed; + } } // Dividends @@ -515,6 +523,8 @@ fn refresh(allocator: std.mem.Allocator) !void { try stdout.print("\nRefresh complete: {d} ok, {d} failed\n", .{ success_count, fail_count }); try stdout.flush(); + + if (fail_count > 0) return error.RefreshFailed; } // ── Main ─────────────────────────────────────────────────────