centralize accounts.srf loading
This commit is contained in:
parent
5ee2151a47
commit
518af59717
4 changed files with 21 additions and 29 deletions
|
|
@ -65,15 +65,7 @@ pub fn run(allocator: std.mem.Allocator, svc: *zfin.DataService, file_path: []co
|
||||||
defer cm.deinit();
|
defer cm.deinit();
|
||||||
|
|
||||||
// Load account tax type metadata (optional)
|
// Load account tax type metadata (optional)
|
||||||
const acct_path = std.fmt.allocPrint(allocator, "{s}accounts.srf", .{file_path[0..dir_end]}) catch return;
|
var acct_map_opt: ?zfin.analysis.AccountMap = svc.loadAccountMap(file_path);
|
||||||
defer allocator.free(acct_path);
|
|
||||||
|
|
||||||
var acct_map_opt: ?zfin.analysis.AccountMap = null;
|
|
||||||
const acct_data = std.fs.cwd().readFileAlloc(allocator, acct_path, 1024 * 1024) catch null;
|
|
||||||
if (acct_data) |ad| {
|
|
||||||
defer allocator.free(ad);
|
|
||||||
acct_map_opt = zfin.analysis.parseAccountsFile(allocator, ad) catch null;
|
|
||||||
}
|
|
||||||
defer if (acct_map_opt) |*am| am.deinit();
|
defer if (acct_map_opt) |*am| am.deinit();
|
||||||
|
|
||||||
var result = zfin.analysis.analyzePortfolio(
|
var result = zfin.analysis.analyzePortfolio(
|
||||||
|
|
|
||||||
|
|
@ -1155,18 +1155,8 @@ pub fn run(allocator: std.mem.Allocator, svc: *zfin.DataService, args: []const [
|
||||||
defer portfolio.deinit();
|
defer portfolio.deinit();
|
||||||
|
|
||||||
// Load accounts.srf
|
// Load accounts.srf
|
||||||
const dir_end = if (std.mem.lastIndexOfScalar(u8, portfolio_path, std.fs.path.sep)) |idx| idx + 1 else 0;
|
var account_map = svc.loadAccountMap(portfolio_path) orelse {
|
||||||
const acct_path = std.fmt.allocPrint(allocator, "{s}accounts.srf", .{portfolio_path[0..dir_end]}) catch return;
|
try cli.stderrPrint("Error: Cannot read/parse accounts.srf (needed for account number mapping)\n");
|
||||||
defer allocator.free(acct_path);
|
|
||||||
|
|
||||||
const acct_data = std.fs.cwd().readFileAlloc(allocator, acct_path, 1024 * 1024) catch {
|
|
||||||
try cli.stderrPrint("Error: Cannot read accounts.srf (needed for account number mapping)\n");
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
defer allocator.free(acct_data);
|
|
||||||
|
|
||||||
var account_map = analysis.parseAccountsFile(allocator, acct_data) catch {
|
|
||||||
try cli.stderrPrint("Error: Cannot parse accounts.srf\n");
|
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
defer account_map.deinit();
|
defer account_map.deinit();
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ const EtfProfile = @import("models/etf_profile.zig").EtfProfile;
|
||||||
const Config = @import("config.zig").Config;
|
const Config = @import("config.zig").Config;
|
||||||
const cache = @import("cache/store.zig");
|
const cache = @import("cache/store.zig");
|
||||||
const srf = @import("srf");
|
const srf = @import("srf");
|
||||||
|
const analysis = @import("analytics/analysis.zig");
|
||||||
const TwelveData = @import("providers/twelvedata.zig").TwelveData;
|
const TwelveData = @import("providers/twelvedata.zig").TwelveData;
|
||||||
const Polygon = @import("providers/polygon.zig").Polygon;
|
const Polygon = @import("providers/polygon.zig").Polygon;
|
||||||
const Finnhub = @import("providers/finnhub.zig").Finnhub;
|
const Finnhub = @import("providers/finnhub.zig").Finnhub;
|
||||||
|
|
@ -1334,6 +1335,22 @@ pub const DataService = struct {
|
||||||
fn isMutualFund(symbol: []const u8) bool {
|
fn isMutualFund(symbol: []const u8) bool {
|
||||||
return symbol.len == 5 and symbol[4] == 'X';
|
return symbol.len == 5 and symbol[4] == 'X';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ── User config files ─────────────────────────────────────────
|
||||||
|
|
||||||
|
/// Load and parse accounts.srf from the same directory as the given portfolio path.
|
||||||
|
/// Returns null if the file doesn't exist or can't be parsed.
|
||||||
|
/// Caller owns the returned AccountMap and must call deinit().
|
||||||
|
pub fn loadAccountMap(self: *DataService, portfolio_path: []const u8) ?analysis.AccountMap {
|
||||||
|
const dir_end = if (std.mem.lastIndexOfScalar(u8, portfolio_path, std.fs.path.sep)) |idx| idx + 1 else 0;
|
||||||
|
const acct_path = std.fmt.allocPrint(self.allocator, "{s}accounts.srf", .{portfolio_path[0..dir_end]}) catch return null;
|
||||||
|
defer self.allocator.free(acct_path);
|
||||||
|
|
||||||
|
const data = std.fs.cwd().readFileAlloc(self.allocator, acct_path, 1024 * 1024) catch return null;
|
||||||
|
defer self.allocator.free(data);
|
||||||
|
|
||||||
|
return analysis.parseAccountsFile(self.allocator, data) catch null;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// ── Tests ─────────────────────────────────────────────────────────
|
// ── Tests ─────────────────────────────────────────────────────────
|
||||||
|
|
|
||||||
|
|
@ -827,14 +827,7 @@ pub const App = struct {
|
||||||
pub fn ensureAccountMap(self: *App) void {
|
pub fn ensureAccountMap(self: *App) void {
|
||||||
if (self.account_map != null) return;
|
if (self.account_map != null) return;
|
||||||
const ppath = self.portfolio_path orelse return;
|
const ppath = self.portfolio_path orelse return;
|
||||||
const dir_end = if (std.mem.lastIndexOfScalar(u8, ppath, std.fs.path.sep)) |idx| idx + 1 else 0;
|
self.account_map = self.svc.loadAccountMap(ppath);
|
||||||
const acct_path = std.fmt.allocPrint(self.allocator, "{s}accounts.srf", .{ppath[0..dir_end]}) catch return;
|
|
||||||
defer self.allocator.free(acct_path);
|
|
||||||
|
|
||||||
if (std.fs.cwd().readFileAlloc(self.allocator, acct_path, 1024 * 1024)) |acct_data| {
|
|
||||||
defer self.allocator.free(acct_data);
|
|
||||||
self.account_map = zfin.analysis.parseAccountsFile(self.allocator, acct_data) catch null;
|
|
||||||
} else |_| {}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set or clear the account filter. Owns the string via allocator.
|
/// Set or clear the account filter. Owns the string via allocator.
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue