Skip to content

Commit

Permalink
Parse addresses from header. variables
Browse files Browse the repository at this point in the history
  • Loading branch information
mdecimus committed Sep 22, 2023
1 parent 44f5961 commit 4979238
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 6 deletions.
44 changes: 38 additions & 6 deletions src/runtime/eval.rs
Original file line number Diff line number Diff line change
Expand Up @@ -307,29 +307,61 @@ impl HeaderVariable {
.map(Variable::from),
_ => None,
},
HeaderPart::Address(addr) => match &header.value {
HeaderValue::Address(list) => {
let mut list = list.iter();
HeaderPart::Address(part) => match &header.value {
HeaderValue::Address(addr) => {
let mut list = addr.iter();
match self.index_part.cmp(&0) {
Ordering::Greater => list
.nth((self.index_part - 1) as usize)
.and_then(|a| addr.eval_strict(a))
.and_then(|a| part.eval_strict(a))
.map(Variable::from),
Ordering::Less => list
.rev()
.nth((self.index_part.unsigned_abs() - 1) as usize)
.and_then(|a| addr.eval_strict(a))
.and_then(|a| part.eval_strict(a))
.map(Variable::from),
Ordering::Equal => {
for item in list {
if let Some(part) = addr.eval_strict(item) {
if let Some(part) = part.eval_strict(item) {
result.push(Variable::from(part));
}
}
return;
}
}
}
HeaderValue::Text(_) => {
let addr = raw
.get(header.offset_start..header.offset_end)
.and_then(|bytes| match MessageStream::new(bytes).parse_address() {
HeaderValue::Address(addr) => addr.into(),
_ => None,
});
if let Some(addr) = addr {
let mut list = addr.iter();
match self.index_part.cmp(&0) {
Ordering::Greater => list
.nth((self.index_part - 1) as usize)
.and_then(|a| part.eval_strict(a))
.map(|s| Variable::String(s.to_string())),
Ordering::Less => list
.rev()
.nth((self.index_part.unsigned_abs() - 1) as usize)
.and_then(|a| part.eval_strict(a))
.map(|s| Variable::String(s.to_string())),
Ordering::Equal => {
for item in list {
if let Some(part) = part.eval_strict(item) {
result.push(Variable::String(part.to_string()));
}
}
return;
}
}
} else {
None
}
}
_ => None,
},
HeaderPart::Date => {
Expand Down
5 changes: 5 additions & 0 deletions tests/stalwart/extensions.svtest
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ test "Variable scopes" {
test_set "message" text:
From: Giovanni
To: bill.doe@example.net
X-Confirm-Reading-To: <bill@example.net>
Subject: Pranzo d'acqua fa volti sghembi

V kožuščku hudobnega fanta stopiclja mizar
Expand All @@ -134,4 +135,8 @@ test "Header addresses" {
if not eval "header.to.addr == 'bill.doe@example.net' && header.to.name == ''" {
test_fail "header.to.addr == 'bill.doe@example.net' && header.to.name == ''";
}

if not eval "header.X-Confirm-Reading-To.addr == 'bill@example.net'" {
test_fail "header.X-Confirm-Reading-To.addr != 'bill@example.net'";
}
}

0 comments on commit 4979238

Please sign in to comment.