blob: 33c9a9d523cbe2989d3f1c3e87b5578478b5fc12 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
type t = {
localpart : string option;
domainpart : string;
resourcepart : string option;
}
exception InvalidUTF8
let of_string (jid : string) : t =
let open Uchar in
let len = String.length jid in
let rec to_localpart i =
if i <= 0 then
None
else
let c = String.get_utf_8_uchar jid i in
if not (utf_decode_is_valid c)
then raise InvalidUTF8
else
let k = utf_decode_length c in
match utf_decode_uchar c |> to_char with
| '@' -> Some (i + 1)
| _ -> to_localpart (i - k)
and to_resourcepart i =
if i >= len then
None
else
let c = String.get_utf_8_uchar jid i in
if not (utf_decode_is_valid c)
then raise InvalidUTF8
else
let k = utf_decode_length c in
match utf_decode_uchar c |> to_char with
| '/' -> Some i
| _ -> to_resourcepart (i + k)
in let r = to_resourcepart 0 in
let rv = Option.value ~default:len r in
let l = to_localpart (rv-1) in
let lv = Option.value ~default:0 l in
{
localpart = Option.map (fun i -> String.sub jid 0 (i-1)) l;
resourcepart = Option.map (fun i -> String.sub jid (i+1) (len-i-1)) r;
domainpart = String.sub jid lv (rv-lv);
}
|