mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-26 13:29:12 +00:00
Merge pull request #3990 from roc-lang/pass-args-to-cli
Pass args from cli platform to app
This commit is contained in:
commit
21f3d4b8bc
11 changed files with 114 additions and 53 deletions
|
@ -61,12 +61,18 @@ mod cli_run {
|
|||
#[cfg(target_os = "macos")]
|
||||
const ALLOW_VALGRIND: bool = false;
|
||||
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
enum Arg<'a> {
|
||||
ExamplePath(&'a str),
|
||||
PlainText(&'a str),
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
struct Example<'a> {
|
||||
filename: &'a str,
|
||||
executable_filename: &'a str,
|
||||
stdin: &'a [&'a str],
|
||||
input_paths: &'a [&'a str],
|
||||
arguments: &'a [Arg<'a>],
|
||||
expected_ending: &'a str,
|
||||
use_valgrind: bool,
|
||||
}
|
||||
|
@ -223,7 +229,7 @@ mod cli_run {
|
|||
stdin: &[&str],
|
||||
executable_filename: &str,
|
||||
flags: &[&str],
|
||||
input_paths: &[&str],
|
||||
args: &[&Arg],
|
||||
expected_ending: &str,
|
||||
) {
|
||||
assert!(input_paths.is_empty(), "Wasm does not support input files");
|
||||
|
@ -273,10 +279,20 @@ mod cli_run {
|
|||
let file_name = example_file(dir_name, example.filename);
|
||||
|
||||
let mut app_args: Vec<String> = vec![];
|
||||
for file in example.input_paths {
|
||||
app_args.push(example_file(dir_name, file).to_str().unwrap().to_string());
|
||||
for arg in example.arguments {
|
||||
match arg {
|
||||
Arg::ExamplePath(file) => {
|
||||
app_args.push(example_file(dir_name, file).to_str().unwrap().to_string());
|
||||
}
|
||||
Arg::PlainText(arg) => {
|
||||
app_args.push(arg.to_string());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// workaround for surgical linker issue, see PR #3990
|
||||
let mut custom_flags : Vec<&str> = vec![];
|
||||
|
||||
match example.executable_filename {
|
||||
"form" | "hello-gui" | "breakout" | "ruby" => {
|
||||
// Since these require things the build system often doesn't have
|
||||
|
@ -296,6 +312,9 @@ mod cli_run {
|
|||
eprintln!("WARNING: skipping testing example {} because it only works in a browser!", example.filename);
|
||||
return;
|
||||
}
|
||||
"args" => {
|
||||
custom_flags = vec![LINKER_FLAG, "legacy"];
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
|
||||
|
@ -304,12 +323,13 @@ mod cli_run {
|
|||
&file_name,
|
||||
example.stdin,
|
||||
example.executable_filename,
|
||||
&[],
|
||||
&custom_flags,
|
||||
&app_args,
|
||||
example.expected_ending,
|
||||
example.use_valgrind,
|
||||
);
|
||||
|
||||
custom_flags.push(OPTIMIZE_FLAG);
|
||||
// This is mostly because the false interpreter is still very slow -
|
||||
// 25s for the cli tests is just not acceptable during development!
|
||||
#[cfg(not(debug_assertions))]
|
||||
|
@ -317,7 +337,7 @@ mod cli_run {
|
|||
&file_name,
|
||||
example.stdin,
|
||||
example.executable_filename,
|
||||
&[OPTIMIZE_FLAG],
|
||||
&custom_flags,
|
||||
&app_args,
|
||||
example.expected_ending,
|
||||
example.use_valgrind,
|
||||
|
@ -368,7 +388,7 @@ mod cli_run {
|
|||
filename: "main.roc",
|
||||
executable_filename: "helloWorld",
|
||||
stdin: &[],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending:"Hello, World!\n",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
@ -376,7 +396,7 @@ mod cli_run {
|
|||
filename: "main.roc",
|
||||
executable_filename: "rocLovesPlatforms",
|
||||
stdin: &[],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending:"Which platform am I running on now?\n",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
@ -387,7 +407,7 @@ mod cli_run {
|
|||
// filename: "rocLovesC.roc",
|
||||
// executable_filename: "rocLovesC",
|
||||
// stdin: &[],
|
||||
// input_paths: &[],
|
||||
// arguments: &[],
|
||||
// expected_ending:"Roc <3 C!\n",
|
||||
// use_valgrind: true,
|
||||
// },
|
||||
|
@ -395,7 +415,7 @@ mod cli_run {
|
|||
filename: "rocLovesRust.roc",
|
||||
executable_filename: "rocLovesRust",
|
||||
stdin: &[],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending:"Roc <3 Rust!\n",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
@ -403,7 +423,7 @@ mod cli_run {
|
|||
filename: "rocLovesSwift.roc",
|
||||
executable_filename: "rocLovesSwift",
|
||||
stdin: &[],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending:"Roc <3 Swift!\n",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
@ -411,7 +431,7 @@ mod cli_run {
|
|||
filename: "rocLovesWebAssembly.roc",
|
||||
executable_filename: "rocLovesWebAssembly",
|
||||
stdin: &[],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending:"Roc <3 Web Assembly!\n",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
@ -419,7 +439,7 @@ mod cli_run {
|
|||
filename: "rocLovesZig.roc",
|
||||
executable_filename: "rocLovesZig",
|
||||
stdin: &[],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending:"Roc <3 Zig!\n",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
@ -427,7 +447,7 @@ mod cli_run {
|
|||
filename: "main.roc",
|
||||
executable_filename: "libhello",
|
||||
stdin: &[],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending:"",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
@ -435,7 +455,7 @@ mod cli_run {
|
|||
filename: "fibonacci.roc",
|
||||
executable_filename: "fibonacci",
|
||||
stdin: &[],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending:"55\n",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
@ -443,7 +463,7 @@ mod cli_run {
|
|||
filename: "Hello.roc",
|
||||
executable_filename: "hello-gui",
|
||||
stdin: &[],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending: "",
|
||||
use_valgrind: false,
|
||||
},
|
||||
|
@ -451,7 +471,7 @@ mod cli_run {
|
|||
filename: "breakout.roc",
|
||||
executable_filename: "breakout",
|
||||
stdin: &[],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending: "",
|
||||
use_valgrind: false,
|
||||
},
|
||||
|
@ -459,7 +479,7 @@ mod cli_run {
|
|||
filename: "quicksort.roc",
|
||||
executable_filename: "quicksort",
|
||||
stdin: &[],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending: "[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2]\n",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
@ -467,15 +487,23 @@ mod cli_run {
|
|||
// filename: "Quicksort.roc",
|
||||
// executable_filename: "quicksort",
|
||||
// stdin: &[],
|
||||
// input_paths: &[],
|
||||
// arguments: &[],
|
||||
// expected_ending: "[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2]\n",
|
||||
// use_valgrind: true,
|
||||
// },
|
||||
args:"interactive" => Example {
|
||||
filename: "args.roc",
|
||||
executable_filename: "args",
|
||||
stdin: &[],
|
||||
arguments: &[Arg::PlainText("hello"), Arg::PlainText("world")],
|
||||
expected_ending: "hello world\n",
|
||||
use_valgrind: false,
|
||||
},
|
||||
effects:"interactive" => Example {
|
||||
filename: "effects.roc",
|
||||
executable_filename: "effects",
|
||||
stdin: &["hi there!"],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending: "hi there!\nIt is known\n",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
@ -483,7 +511,7 @@ mod cli_run {
|
|||
// filename: "Main.roc",
|
||||
// executable_filename: "tea-example",
|
||||
// stdin: &[],
|
||||
// input_paths: &[],
|
||||
// arguments: &[],
|
||||
// expected_ending: "",
|
||||
// use_valgrind: true,
|
||||
// },
|
||||
|
@ -491,7 +519,7 @@ mod cli_run {
|
|||
filename: "form.roc",
|
||||
executable_filename: "form",
|
||||
stdin: &["Giovanni\n", "Giorgio\n"],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending: "Hi, Giovanni Giorgio! 👋\n",
|
||||
use_valgrind: false,
|
||||
},
|
||||
|
@ -499,7 +527,7 @@ mod cli_run {
|
|||
filename: "tui.roc",
|
||||
executable_filename: "tui",
|
||||
stdin: &["foo\n"], // NOTE: adding more lines leads to memory leaks
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending: "Hello Worldfoo!\n",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
@ -507,7 +535,7 @@ mod cli_run {
|
|||
// filename: "Main.roc",
|
||||
// executable_filename: "custom-malloc-example",
|
||||
// stdin: &[],
|
||||
// input_paths: &[],
|
||||
// arguments: &[],
|
||||
// expected_ending: "ms!\nThe list was small!\n",
|
||||
// use_valgrind: true,
|
||||
// },
|
||||
|
@ -515,7 +543,7 @@ mod cli_run {
|
|||
// filename: "Main.roc",
|
||||
// executable_filename: "task-example",
|
||||
// stdin: &[],
|
||||
// input_paths: &[],
|
||||
// arguments: &[],
|
||||
// expected_ending: "successfully wrote to file\n",
|
||||
// use_valgrind: true,
|
||||
// },
|
||||
|
@ -524,7 +552,7 @@ mod cli_run {
|
|||
filename: "False.roc",
|
||||
executable_filename: "false",
|
||||
stdin: &[],
|
||||
input_paths: &["examples/hello.false"],
|
||||
arguments: &[Arg::ExamplePath("examples/hello.false")],
|
||||
expected_ending:"Hello, World!\n",
|
||||
use_valgrind: false,
|
||||
}
|
||||
|
@ -534,7 +562,7 @@ mod cli_run {
|
|||
filename: "static-site.roc",
|
||||
executable_filename: "static-site",
|
||||
stdin: &[],
|
||||
input_paths: &["input", "output"],
|
||||
arguments: &[Arg::ExamplePath("input"), Arg::ExamplePath("output")],
|
||||
expected_ending: "Processed 3 files with 3 successes and 0 errors\n",
|
||||
use_valgrind: false,
|
||||
}
|
||||
|
@ -564,8 +592,15 @@ mod cli_run {
|
|||
let mut ran_without_optimizations = false;
|
||||
|
||||
let mut app_args: Vec<String> = vec![];
|
||||
for file in benchmark.input_paths {
|
||||
app_args.push(examples_dir("benchmarks").join(file).to_str().unwrap().to_string());
|
||||
for arg in benchmark.arguments {
|
||||
match arg {
|
||||
Arg::ExamplePath(file) => {
|
||||
app_args.push(examples_dir("benchmarks").join(file).to_str().unwrap().to_string());
|
||||
}
|
||||
Arg::PlainText(arg) => {
|
||||
app_args.push(arg.to_string());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BENCHMARKS_BUILD_PLATFORM.call_once( || {
|
||||
|
@ -717,7 +752,7 @@ mod cli_run {
|
|||
filename: "NQueens.roc",
|
||||
executable_filename: "nqueens",
|
||||
stdin: &["6"],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending: "4\n",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
@ -725,7 +760,7 @@ mod cli_run {
|
|||
filename: "CFold.roc",
|
||||
executable_filename: "cfold",
|
||||
stdin: &["3"],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending: "11 & 11\n",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
@ -733,7 +768,7 @@ mod cli_run {
|
|||
filename: "Deriv.roc",
|
||||
executable_filename: "deriv",
|
||||
stdin: &["2"],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending: "1 count: 6\n2 count: 22\n",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
@ -741,7 +776,7 @@ mod cli_run {
|
|||
filename: "RBTreeCk.roc",
|
||||
executable_filename: "rbtree-ck",
|
||||
stdin: &["100"],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending: "10\n",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
@ -749,7 +784,7 @@ mod cli_run {
|
|||
filename: "RBTreeInsert.roc",
|
||||
executable_filename: "rbtree-insert",
|
||||
stdin: &[],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending: "Node Black 0 {} Empty Empty\n",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
@ -757,7 +792,7 @@ mod cli_run {
|
|||
// filename: "RBTreeDel.roc",
|
||||
// executable_filename: "rbtree-del",
|
||||
// stdin: &["420"],
|
||||
// input_paths: &[],
|
||||
// arguments: &[],
|
||||
// expected_ending: "30\n",
|
||||
// use_valgrind: true,
|
||||
// },
|
||||
|
@ -765,7 +800,7 @@ mod cli_run {
|
|||
filename: "TestAStar.roc",
|
||||
executable_filename: "test-astar",
|
||||
stdin: &[],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending: "True\n",
|
||||
use_valgrind: false,
|
||||
},
|
||||
|
@ -773,7 +808,7 @@ mod cli_run {
|
|||
filename: "TestBase64.roc",
|
||||
executable_filename: "test-base64",
|
||||
stdin: &[],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending: "encoded: SGVsbG8gV29ybGQ=\ndecoded: Hello World\n",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
@ -781,7 +816,7 @@ mod cli_run {
|
|||
filename: "Closure.roc",
|
||||
executable_filename: "closure",
|
||||
stdin: &[],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending: "",
|
||||
use_valgrind: false,
|
||||
},
|
||||
|
@ -789,7 +824,7 @@ mod cli_run {
|
|||
filename: "Issue2279.roc",
|
||||
executable_filename: "issue2279",
|
||||
stdin: &[],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending: "Hello, world!\n",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
@ -797,7 +832,7 @@ mod cli_run {
|
|||
filename: "QuicksortApp.roc",
|
||||
executable_filename: "quicksortapp",
|
||||
stdin: &[],
|
||||
input_paths: &[],
|
||||
arguments: &[],
|
||||
expected_ending: "todo put the correct quicksort answer here",
|
||||
use_valgrind: true,
|
||||
},
|
||||
|
|
|
@ -3,7 +3,7 @@ app "type-error"
|
|||
imports [pf.Stdout.{ line }, pf.Task.{ await }]
|
||||
provides [main] to pf
|
||||
|
||||
main =
|
||||
main = \_args ->
|
||||
_ <- await (line "a")
|
||||
_ <- await (line "b")
|
||||
_ <- await (line "c")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue