summaryrefslogtreecommitdiff
path: root/lib/wire.ml
blob: ce50f783cb024f9175069c1258f5dd83e84bc2d1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
open Lwt.Syntax
open Markup
open Xml

(** [next stream] is a promise containing a full stanza of the fragments of
    [stream]. *)
let next (stream : (signal, async) stream) : (signal, sync) stream Lwt.t =
  let traverse_stanza depth fragment =
    let depth = match fragment with
      | `Start_element _ -> depth + 1
      | `End_element -> depth - 1
      | _ -> depth
    in ([fragment], if depth = 0 then None else Some depth)
  in transform traverse_stanza 0 stream |> Markup_lwt.load

(** [get stream] is a promise containing a single Xml element of [stream]. *)
let get (stream : (signal, async) stream) : element Lwt.t =
  let* signal = next stream
  in match tree signal with
     | Some xml -> Lwt.return xml
     | None -> Lwt.fail (InvalidStanza (signal |> write_xml |> to_string))