summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2012-03-08 00:55:06 -0600
committerJohn Wiegley <johnw@newartisans.com>2012-03-08 00:55:06 -0600
commit21e8b7f6f0a182f67899c5cd3689a5e646d8ed4a (patch)
tree2f9124c1ca3584532c457eab2d7679d4821f0a05
parent17a84642fbb4684d5a8415371003f12ccb760d99 (diff)
downloadfork-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.cc9
-rw-r--r--src/commodity.h2
-rw-r--r--src/report.cc20
-rw-r--r--src/report.h1
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);