# HG changeset patch # User Thomas Gazagnaire # Date 1262958466 0 # Node ID 28e332232a4922c6172a64055671272deef026b4 # Parent bca2a17d2f9e9af21773061a902be48f990c4f08 [rpc-light] when (un)marshaling variant, if it has no arguments then consider it as a string. This bit is also necessary to discuss with the SM backend. Basically, if you have 'type t = Foo | Bar of int with rpc' you will consider than the value Foo is actually the same thing as the string "Foo" (if you don't want to have a capital letter, use polymorphic variants as 'type t = [ `foo | `bar of int ]' which will give that the value `foo will be considered as the string "foo"). Signed-off-by: Thomas Gazagnaire diff -r bca2a17d2f9e -r 28e332232a49 rpc-light/examples/Makefile --- a/rpc-light/examples/Makefile Fri Jan 08 13:47:46 2010 +0000 +++ b/rpc-light/examples/Makefile Fri Jan 08 13:47:46 2010 +0000 @@ -9,7 +9,8 @@ xapi \ option \ encoding \ - dict + dict \ + variants EXECS=$(foreach example, $(EXAMPLES), $(example).opt) diff -r bca2a17d2f9e -r 28e332232a49 rpc-light/examples/variants.ml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rpc-light/examples/variants.ml Fri Jan 08 13:47:46 2010 +0000 @@ -0,0 +1,16 @@ +type t = [ `foo | `bar of int * string ] with rpc + +let _ = + let t1 = `foo in + let t2 = `bar (3, "bar") in + + let r1 = rpc_of_t t1 in + let r2 = rpc_of_t t2 in + + Printf.printf "r1 = %s\nr2 = %s\n%!" (Rpc.to_string r1) (Rpc.to_string r2); + + let t1' = t_of_rpc r1 in + let t2' = t_of_rpc r2 in + + Printf.printf "t1 = t1' : %b\nt2 = t2' : %b\n%!" (t1 = t1') (t2 = t2'); + assert (t1 = t1' && t2 = t2') diff -r bca2a17d2f9e -r 28e332232a49 rpc-light/examples/xapi.ml --- a/rpc-light/examples/xapi.ml Fri Jan 08 13:47:46 2010 +0000 +++ b/rpc-light/examples/xapi.ml Fri Jan 08 13:47:46 2010 +0000 @@ -1,3 +1,23 @@ +let array_call = +" + event.register + + + OpaqueRef:8ecbbb2a-a905-d422-1153-fadc00639b12 + + + + + + pbd + + + + + + +" + let simple_call = " session.login_with_password @@ -103,16 +123,18 @@ let _ = Printf.printf "Parsing SM XML ... %!"; - Xmlrpc.response_of_string sm; + let _ = Xmlrpc.response_of_string sm in Printf.printf "OK\nParsing empty tags ... %!"; - Xmlrpc.of_string empty; + let _ = Xmlrpc.of_string empty in Printf.printf "OK\nParsing error ... %!"; - Xmlrpc.response_of_string error; + let _ = Xmlrpc.response_of_string error in Printf.printf "OK\nParsing simple call ... %!"; - Xmlrpc.call_of_string simple_call; + let _ = Xmlrpc.call_of_string simple_call in + + Printf.printf "OK\nParsing array call ... %!" + let _ = Xmlrpc.call_of_string array_call in Printf.printf "OK\n%!" - diff -r bca2a17d2f9e -r 28e332232a49 rpc-light/p4_rpc.ml --- a/rpc-light/p4_rpc.ml Fri Jan 08 13:47:46 2010 +0000 +++ b/rpc-light/p4_rpc.ml Fri Jan 08 13:47:46 2010 +0000 @@ -194,7 +194,11 @@ let ids, ctyps = decompose_variants _loc t in let pattern (n, t) ctyps = let ids, pids = new_id_list _loc ctyps in - let body = <:expr< Rpc.Enum [ Rpc.String $str:n$ :: $expr_list_of_list _loc (List.map2 create ids ctyps)$ ] >> in + let body = + if ids = [] then + <:expr< Rpc.String $str:n$ >> + else + <:expr< Rpc.Enum [ Rpc.String $str:n$ :: $expr_list_of_list _loc (List.map2 create ids ctyps)$ ] >> in <:match_case< $recompose_variant _loc (n,t) pids$ -> $body$ >> in let patterns = mcOr_of_list (List.map2 pattern ids ctyps) in <:expr< match $id$ with [ $patterns$ ] >> @@ -356,7 +360,11 @@ let ids, ctyps = decompose_variants _loc t in let pattern (n, t) ctyps = let ids, pids = new_id_list _loc ctyps in - let patt = <:patt< Rpc.Enum [ Rpc.String $str:n$ :: $patt_list_of_list _loc pids$ ] >> in + let patt = + if ids = [] then + <:patt< Rpc.String $str:n$ >> + else + <:patt< Rpc.Enum [ Rpc.String $str:n$ :: $patt_list_of_list _loc pids$ ] >> in let exprs = List.map2 (create name) ids ctyps in let body = List.fold_right (fun a b -> <:expr< $b$ $a$ >>) diff -r bca2a17d2f9e -r 28e332232a49 rpc-light/run_test --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rpc-light/run_test Fri Jan 08 13:47:46 2010 +0000 @@ -0,0 +1,14 @@ +#!/bin/bash + +make +make uninstall +make install + +make -C examples clean +make -C examples + +./examples/all_types.opt +./examples/xapi.opt +./examples/option.opt +./examples/dict.opt +./examples/variants.opt \ No newline at end of file