foundry_cli/opts/build/
mod.rs1use clap::Parser;
2use foundry_compilers::artifacts::{EvmVersion, output_selection::ContractOutputSelection};
3use serde::Serialize;
4
5mod core;
6pub use self::core::BuildOpts;
7
8mod paths;
9pub use self::paths::ProjectPathOpts;
10
11mod utils;
12pub use self::utils::{configure_pcx, configure_pcx_from_solc};
13
14#[derive(Clone, Debug, Default, Serialize, Parser)]
19#[command(next_help_heading = "Compiler options")]
20pub struct CompilerOpts {
21 #[arg(long, help_heading = "Compiler options")]
23 #[serde(skip)]
24 pub ast: bool,
25
26 #[arg(long, value_name = "VERSION")]
28 #[serde(skip_serializing_if = "Option::is_none")]
29 pub evm_version: Option<EvmVersion>,
30
31 #[arg(long, default_missing_value="true", num_args = 0..=1)]
33 #[serde(skip)]
34 pub optimize: Option<bool>,
35
36 #[arg(long, value_name = "RUNS")]
42 #[serde(skip_serializing_if = "Option::is_none")]
43 pub optimizer_runs: Option<usize>,
44
45 #[arg(long, num_args(1..), value_name = "SELECTOR")]
51 #[serde(skip_serializing_if = "Vec::is_empty")]
52 pub extra_output: Vec<ContractOutputSelection>,
53
54 #[arg(long, num_args(1..), value_name = "SELECTOR")]
58 #[serde(skip_serializing_if = "Vec::is_empty")]
59 pub extra_output_files: Vec<ContractOutputSelection>,
60}
61
62#[cfg(test)]
63mod tests {
64 use super::*;
65
66 #[test]
67 fn can_parse_evm_version() {
68 let args: CompilerOpts =
69 CompilerOpts::parse_from(["foundry-cli", "--evm-version", "london"]);
70 assert_eq!(args.evm_version, Some(EvmVersion::London));
71 }
72
73 #[test]
74 fn can_parse_extra_output() {
75 let args: CompilerOpts =
76 CompilerOpts::parse_from(["foundry-cli", "--extra-output", "metadata", "ir-optimized"]);
77 assert_eq!(
78 args.extra_output,
79 vec![ContractOutputSelection::Metadata, ContractOutputSelection::IrOptimized]
80 );
81 }
82
83 #[test]
84 fn can_parse_extra_output_files() {
85 let args: CompilerOpts = CompilerOpts::parse_from([
86 "foundry-cli",
87 "--extra-output-files",
88 "metadata",
89 "ir-optimized",
90 ]);
91 assert_eq!(
92 args.extra_output_files,
93 vec![ContractOutputSelection::Metadata, ContractOutputSelection::IrOptimized]
94 );
95 }
96}