My agentic slop goes here. Not intended for anyone else!
at main 3.7 kB view raw
1(** Demonstration of enhanced header processing functionality 2 3 This example shows how to use the new structured header parsing 4 capabilities that implement RFC 8621 Section 4.1.2 access patterns. 5*) 6 7open Jmap_email 8 9let demo_header_parsing () = 10 Printf.printf "=== JMAP Header Processing Demo ===\n\n"; 11 12 (* Create some example headers *) 13 let from_header = Header.create_unsafe 14 ~name:"From" 15 ~value:"\"John Smith\" <john@example.com>, jane@example.com" () in 16 17 let subject_header = Header.create_unsafe 18 ~name:"Subject" 19 ~value:" =?UTF-8?Q?Test_Subject_with_=C3=A9ncoding?= " () in 20 21 let message_id_header = Header.create_unsafe 22 ~name:"Message-ID" 23 ~value:"<abc123@example.com>" () in 24 25 let date_header = Header.create_unsafe 26 ~name:"Date" 27 ~value:"2024-01-15T10:30:00Z" () in 28 29 let list_post_header = Header.create_unsafe 30 ~name:"List-Post" 31 ~value:"<mailto:list@example.com>, <http://example.com/post>" () in 32 33 (* Demonstrate Raw access pattern *) 34 Printf.printf "1. Raw Access Pattern:\n"; 35 Printf.printf " From (raw): %s\n" (Header.as_raw from_header); 36 Printf.printf " Subject (raw): %s\n\n" (Header.as_raw subject_header); 37 38 (* Demonstrate Text access pattern *) 39 Printf.printf "2. Text Access Pattern (with RFC 2047 decoding):\n"; 40 (match Header.as_text subject_header with 41 | Ok text -> Printf.printf " Subject (decoded): %s\n" text 42 | Error _ -> Printf.printf " Subject: Parse error\n"); 43 Printf.printf "\n"; 44 45 (* Demonstrate Addresses access pattern *) 46 Printf.printf "3. Addresses Access Pattern:\n"; 47 (match Header.as_addresses from_header with 48 | Ok addresses -> 49 Printf.printf " From addresses (%d found):\n" (List.length addresses); 50 List.iteri (fun i addr -> 51 match Address.name addr with 52 | Some name -> Printf.printf " %d. %s <%s>\n" (i+1) name (Address.email addr) 53 | None -> Printf.printf " %d. <%s>\n" (i+1) (Address.email addr) 54 ) addresses 55 | Error _ -> Printf.printf " From: Parse error\n"); 56 Printf.printf "\n"; 57 58 (* Demonstrate MessageIds access pattern *) 59 Printf.printf "4. MessageIds Access Pattern:\n"; 60 (match Header.as_message_ids message_id_header with 61 | Ok ids -> 62 Printf.printf " Message-ID: [%s]\n" (String.concat "; " ids) 63 | Error _ -> Printf.printf " Message-ID: Parse error\n"); 64 Printf.printf "\n"; 65 66 (* Demonstrate Date access pattern *) 67 Printf.printf "5. Date Access Pattern:\n"; 68 (match Header.as_date date_header with 69 | Ok date -> 70 Printf.printf " Date: %f (timestamp)\n" (Jmap.Date.to_timestamp date) 71 | Error _ -> Printf.printf " Date: Parse error\n"); 72 Printf.printf "\n"; 73 74 (* Demonstrate URLs access pattern *) 75 Printf.printf "6. URLs Access Pattern:\n"; 76 (match Header.as_urls list_post_header with 77 | Ok urls -> 78 Printf.printf " List-Post URLs: [%s]\n" (String.concat "; " urls) 79 | Error _ -> Printf.printf " List-Post: Parse error\n"); 80 Printf.printf "\n"; 81 82 (* Demonstrate utility functions *) 83 Printf.printf "7. Header List Utilities:\n"; 84 let headers = [from_header; subject_header; message_id_header] in 85 (match Header.find_and_parse_as_text headers "Subject" with 86 | Some text -> Printf.printf " Found Subject: %s\n" text 87 | None -> Printf.printf " Subject not found or not parseable\n"); 88 (match Header.find_and_parse_as_addresses headers "From" with 89 | Some addrs -> Printf.printf " Found %d From addresses\n" (List.length addrs) 90 | None -> Printf.printf " From not found or not parseable\n"); 91 92 Printf.printf "\n=== Demo Complete ===\n" 93 94let () = demo_header_parsing ()