diff --git a/src/ligo/bin/cli.ml b/src/ligo/bin/cli.ml index 64ca6bbe9..fffef2bb7 100644 --- a/src/ligo/bin/cli.ml +++ b/src/ligo/bin/cli.ml @@ -1,3 +1,4 @@ +open Cmdliner open Trace let toplevel x = @@ -6,44 +7,68 @@ let toplevel x = | Errors ss -> Format.printf "Errors: %a\n%!" errors_pp @@ List.map (fun f -> f()) ss -let main () = - let l = Array.length Sys.argv in - let%bind () = - if l < 2 - then simple_fail "Pass a command" - else ok () in - let command = Sys.argv.(1) in - match command with - | "compile" -> ( - let sub_command = Sys.argv.(2) in - match sub_command with - | "file" -> ( - let%bind () = - trace_strong (simple_error "bad number of args") @@ - Assert.assert_equal_int 5 l in - let source = Sys.argv.(3) in - let entry_point = Sys.argv.(4) in - let%bind contract = - trace (simple_error "compile michelson") @@ - Ligo.Contract.compile_contract_file source entry_point in - Format.printf "Contract:\n%s\n" contract ; - ok () - ) - | "expression" -> ( - let%bind () = - trace_strong (simple_error "bad number of args") @@ - Assert.assert_equal_int 6 l in - let source = Sys.argv.(3) in - let entry_point = Sys.argv.(4) in - let expression = Sys.argv.(5) in - let%bind value = - trace (simple_error "compile expression") @@ - Ligo.Contract.compile_contract_parameter source entry_point expression in - Format.printf "Input:\n%s\n" value; - ok () - ) - | _ -> simple_fail "Bad sub-command" - ) - | _ -> simple_fail "Bad command" +let main = + let term = Term.(const print_endline $ const "Ligo needs a command. Do ligo --help") in + (term , Term.info "ligo") -let () = toplevel @@ main () +let compile_file = + let f source entry_point = + toplevel @@ + let%bind contract = + trace (simple_error "compile michelson") @@ + Ligo.Contract.compile_contract_file source entry_point in + Format.printf "Contract:\n%s\n" contract ; + ok () + in + let term = + let source = + let open Arg in + let info = + let docv = "SOURCE_FILE" in + let doc = "$(docv) is the path to the .ligo file of the contract." in + info ~docv ~doc [] in + required @@ pos 0 (some string) None info in + let entry_point = + let open Arg in + let info = + let docv = "ENTRY_POINT" in + let doc = "$(docv) is entry-point that will be compiled." in + info ~docv ~doc [] in + value @@ pos 1 string "main" info in + Term.(const f $ source $ entry_point) in + let docs = "Compile contracts." in + (term , Term.info ~docs "compile-contract") + +let compile_expression = + let f source entry_point expression = + toplevel @@ + let%bind value = + trace (simple_error "compile-input") @@ + Ligo.Contract.compile_contract_parameter source entry_point expression in + Format.printf "Input:\n%s\n" value; + ok () + in + let term = + let source = + let open Arg in + let docv = "SOURCE_FILE" in + let doc = "$(docv) is the path to the .ligo file of the contract." in + let info = info ~docv ~doc [] in + required @@ pos 0 (some string) None info in + let entry_point = + let open Arg in + let docv = "ENTRY_POINT" in + let doc = "$(docv) is the entry-point of the contract." in + let info = info ~docv ~doc [] in + required @@ pos 1 (some string) None info in + let expression = + let open Arg in + let docv = "EXPRESSION" in + let doc = "$(docv) is the expression that will be compiled." in + let info = info ~docv ~doc [] in + required @@ pos 2 (some string) None info in + Term.(const f $ source $ entry_point $ expression) in + let docs = "Compile contracts parameters." in + (term , Term.info ~docs "compile-parameter") + +let () = Term.exit @@ Term.eval_choice main [compile_file ; compile_expression] diff --git a/src/ligo/bin/dune b/src/ligo/bin/dune index 0b50fee28..66ec132b7 100644 --- a/src/ligo/bin/dune +++ b/src/ligo/bin/dune @@ -3,6 +3,7 @@ (public_name ligo) (libraries tezos-utils + cmdliner ligo ) (package ligo)