From da51f5b51051bdc6a0fe10325a3b8b1a2f30d21d Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Tue, 13 May 2014 16:08:10 +0100 Subject: support payee uuid directive The semantics of this are a little bit tricky: we want, if we come across a transaction with exactly the given UUID, to set the transaction's payee to be the specified one. We need to set that payee before the first post in the transaction is parsed, otherwise that post will inherit the wrong payee; however, we need to do it after the transaction's tags have been parsed. The implementation as it is in this commit is potentially a little wasteful, if there are post-like (non-comment non-assertion) entries in the transaction that don't successfully parse as posts. --- src/textual.cc | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'src/textual.cc') diff --git a/src/textual.cc b/src/textual.cc index 0a590e08..60250007 100644 --- a/src/textual.cc +++ b/src/textual.cc @@ -155,6 +155,7 @@ namespace { void payee_directive(char * line); void payee_alias_directive(const string& payee, string alias); + void payee_uuid_directive(const string& payee, string uuid); void commodity_directive(char * line); void commodity_alias_directive(commodity_t& comm, string alias); @@ -1035,6 +1036,8 @@ void instance_t::payee_directive(char * line) string keyword(p); if (keyword == "alias") payee_alias_directive(payee, b); + if (keyword == "uuid") + payee_uuid_directive(payee, b); } } @@ -1045,6 +1048,13 @@ void instance_t::payee_alias_directive(const string& payee, string alias) .push_back(payee_alias_mapping_t(mask_t(alias), payee)); } +void instance_t::payee_uuid_directive(const string& payee, string uuid) +{ + trim(uuid); + context.journal->payee_uuid_mappings + .push_back(payee_uuid_mapping_t(uuid, payee)); +} + void instance_t::commodity_directive(char * line) { char * p = skip_ws(line); @@ -1862,6 +1872,17 @@ xact_t * instance_t::parse_xact(char * line, else { reveal_context = false; + if (!last_post) { + if (xact->has_tag(_("UUID"))) { + string uuid = xact->get_tag(_("UUID"))->to_string(); + foreach (payee_uuid_mapping_t value, context.journal->payee_uuid_mappings) { + if (value.first.compare(uuid) == 0) { + xact->payee = value.second; + } + } + } + } + if (post_t * post = parse_post(p, len - (p - line), account, xact.get())) { reveal_context = true; -- cgit v1.2.3