caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] Using common arguments with Command module of the Core library
@ 2015-08-03 12:18 leowzukw
  2015-08-03 16:53 ` Ben Millwood
  0 siblings, 1 reply; 3+ messages in thread
From: leowzukw @ 2015-08-03 12:18 UTC (permalink / raw)
  To: caml-list


[-- Attachment #1.1: Type: text/plain, Size: 1194 bytes --]

 

Hello everybody,

 I'm trying to use subcommands with the Core library. I would like to
factorize several things : 

 	* A set of common arguments (to set color, verbosity and so on)
 	* A common way to deal with these arguments
 	* A pretty way to define subcommands using these common arguments and
way to handle it.

Main problem is that I can't define more arguments to my subcommand.
More details in my code, which is joined. You may also find it here
(Github gist, could be updated): http://j.mp/1JHlZ6S [1] 

Result of the compilation (corebuild cmd.byte) 

+ ocamlfind ocamlc -c -w A-4-33-40-41-42-43-34-44 -strict-sequence -g
-bin-annot -short-paths -thread -syntax camlp4o -package bin_prot.syntax
-package
sexplib.syntax,comparelib.syntax,fieldslib.syntax,variantslib.syntax
-package core -o cmd.cmo cmd.ml
File "cmd.ml", line 98, characters 5-44:
Warning 48: implicit elimination of optional argument ?extend
File "cmd.ml", line 49, characters 11-341:
Warning 27: unused variable summary.
File "cmd.ml", line 49, characters 20-341:
Warning 27: unused variable args.
Finished, 3 targets (0 cached) in 00:00:03. 

Thanks for your help
Leo 
 

Links:
------
[1] http://j.mp/1JHlZ6S

[-- Attachment #1.2: Type: text/html, Size: 2464 bytes --]

[-- Attachment #2: cmd.ml --]
[-- Type: text/plain, Size: 2525 bytes --]

(* Build with:
  * corebuild cmd.byte *)


open Core.Std;;

(* With this code, we are trying to
 * Define a common set of arguments to be passed to all sub commands
 * Handle these common arguments all the same way
 * Define sub commands in a common, less verbose way *)

(* The program compiled could be used this way
 * cmd.byte sum 32 + 10 # Display 42
 * cmd.byte settings # Display all the settings
 * But we could use common arguments :
 * cmd.byte sum -c 32 + 10 # Display 42 and a message about color
 * cmd.byte settings # Display all the settings
 * *)

(* Problems:
  * Arguments from other commands are not passed to the functions
  * Several XXX below *)

(* Verbosity *)
let verb = ref 0;;
let color = ref false;;

(* A set of common flags *)
let common =
  let open Command.Spec in
  empty
  +> flag "-v" (optional_with_default 0 int)
    ~doc:"n Set verbosity"
  +> flag "-c" (optional_with_default false bool)
    ~doc:"bool Set color"
  +> flag "--rc" (optional_with_default "" string)
    ~doc:"name Set configuration file"
;;

(* Treating common args *)
let parse_common ~f = fun verbosity col rc ->
  verb := verbosity;
  color := col;

  f ~rc
;;

(* Common way to define subcommands *)
let sub ~f ~summary ~args name =
  let open Command in
  let def =
    basic ~summary:"" Spec.(common +> args) (* XXX Couldn't set set summary with
    the argument ~summary of sub function. Error is
      This expression has type t -> bytes
      but an expression was expected of type bytes*)
      (parse_common ~f)
  in
    ( name, def )
;;

(* Two sub commands *)

(* Display the sum of the arguments *)
let sum =
  sub
    ~f:(fun ~rc _ () -> (* XXX Strange arguments passed here *)
      (* We would like to get the numbers passed in arguments ("first number"
       * and "second number" below) *)
      ();
      (* Some code to use common arguments *)
      if !color then printf "Colored\n" else print_endline rc)
    ~args:(Command.Spec.(
      empty
      +> anon ("first number" %: int)
      +> anon ("second number" %: int)
      ))
    ~summary:"Sum"
    "sum"
;;

(* Print some settings and a number passed to the program *)
let settings =
  sub
    ~f:(fun ~rc _ () ->
      printf "Settings\n";
      printf "Rc: %s" rc;
      printf "Color: %b" !color)
    ~args:(let open Command.Spec in
      empty
      )
    ~summary:"Display settings"
    "settings"
;;

let () =
  let open Command in
  group ~summary:"A program to test" [ sum ; settings ]
  |> run ~version:"" ~build_info:"" ~argv:[]
;;

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2015-08-04 17:23 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-08-03 12:18 [Caml-list] Using common arguments with Command module of the Core library leowzukw
2015-08-03 16:53 ` Ben Millwood
     [not found]   ` <05d254b1bbdff3c0030bcc8b85e1c951@vmail.me>
     [not found]     ` <CA+MHO52qGd9CEwwq7pWGQDr9b0r=7niLUBk2qT0yOkSaNRCvSw@mail.gmail.com>
2015-08-04 17:25       ` leowzukw

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).