diff options
author | John Wiegley <johnw@newartisans.com> | 2012-03-08 00:55:06 -0600 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2012-03-08 00:55:06 -0600 |
commit | 21e8b7f6f0a182f67899c5cd3689a5e646d8ed4a (patch) | |
tree | 2f9124c1ca3584532c457eab2d7679d4821f0a05 | |
parent | 17a84642fbb4684d5a8415371003f12ccb760d99 (diff) | |
download | fork-ledger-21e8b7f6f0a182f67899c5cd3689a5e646d8ed4a.tar.gz fork-ledger-21e8b7f6f0a182f67899c5cd3689a5e646d8ed4a.tar.bz2 fork-ledger-21e8b7f6f0a182f67899c5cd3689a5e646d8ed4a.zip |
Added nail_down() for pinning market value exprs
-rw-r--r-- | src/commodity.cc | 9 | ||||
-rw-r--r-- | src/commodity.h | 2 | ||||
-rw-r--r-- | src/report.cc | 20 | ||||
-rw-r--r-- | src/report.h | 1 |
4 files changed, 32 insertions, 0 deletions
diff --git a/src/commodity.cc b/src/commodity.cc index 24d54695..dd1b2743 100644 --- a/src/commodity.cc +++ b/src/commodity.cc @@ -217,6 +217,15 @@ commodity_t::check_for_updated_price(const optional<price_point_t>& point, return point; } +commodity_t& commodity_t::nail_down(const expr_t& expr) +{ + annotation_t new_details; + new_details.value_expr = expr; + commodity_t * new_comm = + commodity_pool_t::current_pool->find_or_create(symbol(), new_details); + return *new_comm; +} + commodity_t::operator bool() const { return this != pool().null_commodity; diff --git a/src/commodity.h b/src/commodity.h index 3d36e35e..3f493f8b 100644 --- a/src/commodity.h +++ b/src/commodity.h @@ -291,6 +291,8 @@ public: const optional<datetime_t>& moment, const optional<commodity_t&>& in_terms_of); + commodity_t& nail_down(const expr_t& expr); + // Methods related to parsing, reading, writing, etc., the commodity // itself. diff --git a/src/report.cc b/src/report.cc index 52e8c888..ba70d1d3 100644 --- a/src/report.cc +++ b/src/report.cc @@ -736,6 +736,24 @@ value_t report_t::fn_commodity(call_scope_t& args) return string_value(args.get<amount_t>(0).commodity().symbol()); } +value_t report_t::fn_nail_down(call_scope_t& args) +{ + value_t arg0(args[0]); + switch (arg0.type()) { + case value_t::AMOUNT: { + amount_t tmp(arg0.as_amount()); + if (tmp.has_commodity()) + tmp.set_commodity(tmp.commodity() + .nail_down(args[1].as_any<expr_t::ptr_op_t>())); + return tmp; + } + + default: + throw_(std::runtime_error, _("Attempting to nail down %1") + << args[0].label()); + } +} + value_t report_t::fn_lot_date(call_scope_t& args) { if (args[0].has_annotation()) { @@ -1261,6 +1279,8 @@ expr_t::ptr_op_t report_t::lookup(const symbol_t::kind_t kind, return WRAP_FUNCTOR(fn_null); else if (is_eq(p, "now")) return MAKE_FUNCTOR(report_t::fn_now); + else if (is_eq(p, "nail_down")) + return MAKE_FUNCTOR(report_t::fn_nail_down); break; case 'o': diff --git a/src/report.h b/src/report.h index f50bdc28..515b14c2 100644 --- a/src/report.h +++ b/src/report.h @@ -170,6 +170,7 @@ public: value_t fn_ansify_if(call_scope_t& scope); value_t fn_percent(call_scope_t& scope); value_t fn_commodity(call_scope_t& scope); + value_t fn_nail_down(call_scope_t& scope); value_t fn_lot_date(call_scope_t& scope); value_t fn_lot_price(call_scope_t& scope); value_t fn_lot_tag(call_scope_t& scope); |