My agentic slop goes here. Not intended for anyone else!
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 ()