Skip to content

Commit 2c1e617

Browse files
committed
Make pattern match failures a bit more graceful.
The previous failure mode was a confusing index failure on matches in captured_parameters
1 parent 9eb9126 commit 2c1e617

File tree

2 files changed

+36
-4
lines changed

2 files changed

+36
-4
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "lambda-s3-restructure"
3-
version = "0.5.0"
3+
version = "0.5.1"
44
edition = "2021"
55
homepage = "https://github.com/buoyant-data/lambda-s3-restructure"
66
authors = [

src/main.rs

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,14 @@ async fn function_handler(
8888
continue;
8989
}
9090

91-
let parameters = add_builtin_parameters(captured_parameters(&router, &source_key)?);
91+
let parameters = match captured_parameters(&router, &source_key) {
92+
Some(params) => add_builtin_parameters(params),
93+
None => {
94+
info!("Triggered with {source_key} which does not match the input pattern, ignoring");
95+
continue;
96+
}
97+
};
98+
9299
let output_key = template.render(&parameters)?;
93100
info!("Copying {source_key:?} to {output_key:?}");
94101
if let Some(bucket) = entity.bucket.name {
@@ -146,13 +153,18 @@ fn entities_from(event: S3Event) -> Result<Vec<S3Entity>, anyhow::Error> {
146153
fn captured_parameters<Handler>(
147154
router: &Router<Handler>,
148155
source_key: &str,
149-
) -> Result<HashMap<String, String>, anyhow::Error> {
156+
) -> Option<HashMap<String, String>> {
150157
let matches = router.matches(source_key);
158+
159+
if matches.is_empty() {
160+
return None;
161+
}
162+
151163
let mut data: HashMap<String, String> = HashMap::new();
152164
for capture in matches[0].captures().into_iter() {
153165
data.insert(capture.name().into(), capture.value().into());
154166
}
155-
Ok(data)
167+
Some(data)
156168
}
157169

158170
/// Return true if the given key matches the pattern and should be excluded from consideration
@@ -310,4 +322,24 @@ mod tests {
310322
.collect();
311323
assert_ne!(filtered, keys);
312324
}
325+
326+
#[test]
327+
fn test_captured_parameters() {
328+
let mut router = Router::new();
329+
router.add("/:ignore/livemode/:table/:filename", 1);
330+
let parameters = captured_parameters(&router, "2025041518/testmode/sometable/part-00000-6dc656c3-fd08-4377-a846-a36f58f5937b-c000.zstd.parquet");
331+
assert_eq!(parameters, None);
332+
333+
let parameters = captured_parameters(&router, "2025041518/livemode/sometable/part-00000-6dc656c3-fd08-4377-a846-a36f58f5937b-c000.zstd.parquet");
334+
335+
let mut expected: HashMap<String, String> = HashMap::default();
336+
expected.insert("ignore".into(), "2025041518".into());
337+
expected.insert("table".into(), "sometable".into());
338+
expected.insert(
339+
"filename".into(),
340+
"part-00000-6dc656c3-fd08-4377-a846-a36f58f5937b-c000.zstd.parquet".into(),
341+
);
342+
343+
assert_eq!(Some(expected), parameters);
344+
}
313345
}

0 commit comments

Comments
 (0)