ligo/src/bin/cli.ml

171 lines
5.7 KiB
OCaml
Raw Normal View History

2019-05-13 00:56:22 +04:00
open Cmdliner
open Trace
2019-06-06 21:37:46 +04:00
let error_pp out (e : error) =
let open JSON_string_utils in
let message =
let opt = e |> member "message" |> string in
let msg = Option.unopt ~default:"" opt in
2019-06-07 00:49:36 +04:00
if msg = ""
then ""
else ": " ^ msg in
2019-06-06 21:37:46 +04:00
let error_code =
let error_code = e |> member "error_code" in
match error_code with
| `Null -> ""
| _ -> " (" ^ (J.to_string error_code) ^ ")" in
let title =
let opt = e |> member "title" |> string in
Option.unopt ~default:"" opt in
let data =
let data = e |> member "data" in
match data with
| `Null -> ""
| _ -> " " ^ (J.to_string data) ^ "\n" in
2019-06-07 00:49:36 +04:00
let infos =
let infos = e |> member "infos" in
match infos with
| `Null -> ""
| _ -> " " ^ (J.to_string infos) ^ "\n" in
Format.fprintf out "%s%s%s.\n%s%s" title error_code message data infos
2019-06-06 21:37:46 +04:00
2019-05-13 00:56:22 +04:00
let toplevel x =
match x with
| Trace.Ok ((), annotations) -> ignore annotations; ()
2019-06-06 21:37:46 +04:00
| Error ss -> (
2019-06-03 15:07:24 +04:00
Format.printf "%a%!" error_pp (ss ())
2019-06-06 21:37:46 +04:00
)
2019-05-13 00:56:22 +04:00
let main =
let term = Term.(const print_endline $ const "Ligo needs a command. Do ligo --help") in
(term , Term.info "ligo")
2019-06-09 16:08:37 +04:00
let source n =
2019-05-30 02:09:40 +04:00
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
2019-06-09 16:08:37 +04:00
required @@ pos n (some string) None info
2019-05-30 02:09:40 +04:00
2019-06-09 16:08:37 +04:00
let entry_point n =
2019-05-30 02:09:40 +04:00
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
2019-06-09 16:08:37 +04:00
required @@ pos n (some string) (Some "main") info
2019-05-30 02:09:40 +04:00
let expression purpose n =
2019-05-30 02:09:40 +04:00
let open Arg in
let docv = purpose ^ "_EXPRESSION" in
2019-05-30 02:09:40 +04:00
let doc = "$(docv) is the expression that will be compiled." in
let info = info ~docv ~doc [] in
2019-06-09 16:08:37 +04:00
required @@ pos n (some string) None info
2019-05-30 02:09:40 +04:00
let syntax =
let open Arg in
let info =
let docv = "SYNTAX" in
let doc = "$(docv) is the syntax that will be used. Currently supported syntaxes are \"pascaligo\" and \"cameligo\". By default, the syntax is guessed from the extension (.ligo and .mligo, respectively)." in
2019-06-06 13:30:29 +04:00
info ~docv ~doc ["syntax" ; "s"] in
value @@ opt string "auto" info
2019-05-30 02:09:40 +04:00
2019-05-13 00:56:22 +04:00
let compile_file =
2019-05-30 02:09:40 +04:00
let f source entry_point syntax =
2019-05-13 00:56:22 +04:00
toplevel @@
let%bind contract =
2019-06-05 21:16:54 +04:00
trace (simple_info "compiling contract to michelson") @@
2019-06-01 15:51:49 +04:00
Ligo.Run.compile_contract_file source entry_point syntax in
2019-06-07 00:49:36 +04:00
Format.printf "%s\n" contract ;
2019-05-13 00:56:22 +04:00
ok ()
in
let term =
2019-06-09 16:08:37 +04:00
Term.(const f $ source 0 $ entry_point 1 $ syntax) in
2019-06-05 21:17:42 +04:00
let cmdname = "compile-contract" in
let docs = "Subcommand: compile a contract. See `ligo " ^ cmdname ^ " --help' for a list of options specific to this subcommand." in
(term , Term.info ~docs cmdname)
2019-05-13 00:56:22 +04:00
let compile_parameter =
2019-05-30 02:09:40 +04:00
let f source entry_point expression syntax =
2019-05-13 00:56:22 +04:00
toplevel @@
let%bind value =
trace (simple_error "compile-input") @@
2019-06-01 15:51:49 +04:00
Ligo.Run.compile_contract_parameter source entry_point expression syntax in
2019-06-07 00:49:36 +04:00
Format.printf "%s\n" value;
2019-05-13 00:56:22 +04:00
ok ()
in
let term =
Term.(const f $ source 0 $ entry_point 1 $ expression "PARAMETER" 2 $ syntax) in
2019-06-05 21:17:42 +04:00
let cmdname = "compile-parameter" in
let docs = "Subcommand: compile parameters to a michelson expression. The resulting michelson expression can be passed as an argument in a transaction which calls a contract. See `ligo " ^ cmdname ^ " --help' for a list of options specific to this subcommand." in
(term , Term.info ~docs cmdname)
2019-05-13 00:56:22 +04:00
let compile_storage =
2019-05-30 02:09:40 +04:00
let f source entry_point expression syntax =
2019-05-13 00:56:22 +04:00
toplevel @@
let%bind value =
trace (simple_error "compile-storage") @@
2019-06-01 15:51:49 +04:00
Ligo.Run.compile_contract_storage source entry_point expression syntax in
2019-06-07 00:49:36 +04:00
Format.printf "%s\n" value;
2019-05-13 00:56:22 +04:00
ok ()
in
let term =
Term.(const f $ source 0 $ entry_point 1 $ expression "STORAGE" 2 $ syntax) in
2019-06-05 21:17:42 +04:00
let cmdname = "compile-storage" in
let docs = "Subcommand: compile an initial storage in ligo syntax to a michelson expression. The resulting michelson expression can be passed as an argument in a transaction which originates a contract. See `ligo " ^ cmdname ^ " --help' for a list of options specific to this subcommand." in
(term , Term.info ~docs cmdname)
2019-05-13 00:56:22 +04:00
2019-06-09 16:08:37 +04:00
let dry_run =
let f source entry_point storage input syntax =
toplevel @@
let%bind output =
Ligo.Run.run_contract source entry_point storage input syntax in
Format.printf "%a\n" Ast_simplified.PP.expression output ;
ok ()
in
let term =
Term.(const f $ source 0 $ entry_point 1 $ expression "PARAMETER" 2 $ expression "STORAGE" 3 $ syntax) in
2019-06-09 16:08:37 +04:00
let cmdname = "dry-run" in
let docs = "Subcommand: run a smart-contract with the given storage and input." in
(term , Term.info ~docs cmdname)
2019-05-13 00:56:22 +04:00
2019-06-11 21:57:07 +04:00
let run_function =
let f source entry_point parameter syntax =
toplevel @@
let%bind output =
Ligo.Run.run_function source entry_point parameter syntax in
Format.printf "%a\n" Ast_simplified.PP.expression output ;
ok ()
in
let term =
Term.(const f $ source 0 $ entry_point 1 $ expression "PARAMETER" 2 $ syntax) in
2019-06-11 21:57:07 +04:00
let cmdname = "run-function" in
let docs = "Subcommand: run a function with the given parameter." in
(term , Term.info ~docs cmdname)
let evaluate_value =
let f source entry_point syntax =
toplevel @@
let%bind output =
Ligo.Run.evaluate_value source entry_point syntax in
Format.printf "%a\n" Ast_simplified.PP.expression output ;
ok ()
in
let term =
Term.(const f $ source 0 $ entry_point 1 $ syntax) in
let cmdname = "evaluate-value" in
let docs = "Subcommand: evaluate a given definition." in
(term , Term.info ~docs cmdname)
let () = Term.exit @@ Term.eval_choice main [
compile_file ;
compile_parameter ;
compile_storage ;
dry_run ;
run_function ;
evaluate_value ;
]