Parse map entries: comma-separated key-value pairs with optional rest pattern Supports syntax like: "key1": pattern1, "key2": pattern2, ..
(
input: syn::parse::ParseStream,
)
| 48 | /// Parse map entries: comma-separated key-value pairs with optional rest pattern |
| 49 | /// Supports syntax like: "key1": pattern1, "key2": pattern2, .. |
| 50 | fn parse_map_entries( |
| 51 | input: syn::parse::ParseStream, |
| 52 | ) -> syn::Result<(Vec<(syn::Expr, Pattern)>, bool)> { |
| 53 | let mut entries = Vec::new(); |
| 54 | let mut rest = false; |
| 55 | |
| 56 | while !input.is_empty() { |
| 57 | // Check for rest pattern (..) which allows partial matching |
| 58 | if input.peek(Token![..]) { |
| 59 | let _: Token![..] = input.parse()?; |
| 60 | rest = true; |
| 61 | break; |
| 62 | } |
| 63 | |
| 64 | // Parse key expression |
| 65 | let key: syn::Expr = input.parse()?; |
| 66 | |
| 67 | // Expect colon separator |
| 68 | let _: Token![:] = input.parse()?; |
| 69 | |
| 70 | // Parse value pattern |
| 71 | let value = input.parse()?; |
| 72 | |
| 73 | entries.push((key, value)); |
| 74 | |
| 75 | if input.is_empty() { |
| 76 | break; |
| 77 | } |
| 78 | |
| 79 | let _: Token![,] = input.parse()?; |
| 80 | |
| 81 | // Rest pattern can appear after a comma |
| 82 | if input.peek(Token![..]) { |
| 83 | let _: Token![..] = input.parse()?; |
| 84 | rest = true; |
| 85 | break; |
| 86 | } |
| 87 | } |
| 88 | |
| 89 | Ok((entries, rest)) |
| 90 | } |