hop-2012/factory.ml

39 lines
1.0 KiB
OCaml

open Printf
open Sexp
open Datastructures
type factory_t = Sexp.t -> Sexp.t option
let classes = ref StringMap.empty
let register_class name factory =
if StringMap.mem name !classes
then (printf "ERROR: Duplicate node class name %s\n%!" name;
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
| None ->
Message.create_ok
| Some explanation ->
Message.create_failed explanation
in
Node.post_ignore reply_sink (Str reply_name) reply (Str "")
| None ->
printf "WARNING: Node class not found <<%s>>\n%!" classname)
| m ->
Util.message_not_understood "factory" m
let init () =
Node.bind_ignore ("factory", Node.make "factory" factory_handler)