hop-2012/factory.ml

41 lines
1.2 KiB
OCaml
Raw Normal View History

2012-01-08 17:41:04 +00:00
open Printf
open Sexp
open Datastructures
type factory_t = Sexp.t -> (Sexp.t, Sexp.t) Status.t
2012-01-08 17:41:04 +00:00
let classes = ref StringMap.empty
let register_class name factory =
if StringMap.mem name !classes
2012-01-08 19:48:07 +00:00
then (fprintf stderr "ERROR: Duplicate node class name %s\n%!" name;
2012-01-08 17:41:04 +00:00
exit 1)
else classes := StringMap.add name factory !classes
let lookup_class name =
try Some (StringMap.find name !classes)
with Not_found -> None
let factory_handler n sexp =
match Message.message_of_sexp sexp with
| Message.Create (Str classname, arg, Str reply_sink, Str reply_name) ->
(match lookup_class classname with
| Some factory ->
let reply =
match factory arg with
| Status.Ok info ->
Log.info "Node create ok" [Str classname; arg; Str reply_sink; Str reply_name];
Message.create_ok info
| Status.Problem explanation ->
Log.info "Node create failed" [Str classname; arg; Str reply_sink; Str reply_name];
2012-01-08 17:41:04 +00:00
Message.create_failed explanation
in
Node.post_ignore reply_sink (Str reply_name) reply (Str "")
| None ->
2012-01-08 19:48:07 +00:00
Log.warn "Node class not found" [Str classname])
2012-01-08 17:41:04 +00:00
| m ->
Util.message_not_understood "factory" m
let init () =
Node.bind_ignore ("factory", Node.make "factory" factory_handler)