open Utilities.Result let assemble config = let* storage = Configuration.find_section "storage" config |> Option.to_result ~none:(Configuration.Error.missing_section "storage") in let* _, transport = Configuration.require_section ~name:"transport" ~valid_tags:["tcp"] config in let* transport = Transport.TCP.parse transport in let* kernel = RNT.initialize storage in let module L = Listener.Make (Transport.TCP) in Ok (fun () -> L.run kernel (Transport.TCP.create transport)) let run_from_config path = let* config = Configuration.load ~expected_keys:["storage"; "transport"] path in assemble config