diff --git a/crates/nargo_cli/src/errors.rs b/crates/nargo_cli/src/errors.rs index 78db35728a4..ee7ea12f761 100644 --- a/crates/nargo_cli/src/errors.rs +++ b/crates/nargo_cli/src/errors.rs @@ -123,8 +123,13 @@ pub(crate) enum ManifestError { #[error("Unxpected workspace definition found in {0}")] UnexpectedWorkspace(PathBuf), - #[error("Cannot find file {0} which is required due to specifying the `{1}` package type")] - MissingEntryFile(PathBuf, PackageType), + #[error("Cannot find file {entry} which was specified as the `entry` field in {toml}")] + MissingEntryFile { toml: PathBuf, entry: PathBuf }, + + #[error( + r#"Cannot find file {entry} which is defaulted due to specifying `type = "{package_type}"` in {toml}"# + )] + MissingDefaultEntryFile { toml: PathBuf, entry: PathBuf, package_type: PackageType }, /// Invalid character `-` in package name #[error("invalid character `-` in package name")] diff --git a/crates/nargo_cli/src/manifest.rs b/crates/nargo_cli/src/manifest.rs index 1f522a732d8..b7b1d6d2d5c 100644 --- a/crates/nargo_cli/src/manifest.rs +++ b/crates/nargo_cli/src/manifest.rs @@ -48,22 +48,44 @@ impl PackageConfig { None => return Err(ManifestError::MissingPackageType(root_dir.join("Nargo.toml"))), }; - let entry_path = match package_type { - PackageType::Library => root_dir.join("src").join("lib").with_extension(FILE_EXTENSION), - PackageType::Binary => root_dir.join("src").join("main").with_extension(FILE_EXTENSION), + let entry_path = if let Some(entry_path) = &self.package.entry { + let custom_entry_path = root_dir.join(entry_path); + if custom_entry_path.exists() { + custom_entry_path + } else { + return Err(ManifestError::MissingEntryFile { + toml: root_dir.join("Nargo.toml"), + entry: custom_entry_path, + }); + } + } else { + let default_entry_path = match package_type { + PackageType::Library => { + root_dir.join("src").join("lib").with_extension(FILE_EXTENSION) + } + PackageType::Binary => { + root_dir.join("src").join("main").with_extension(FILE_EXTENSION) + } + }; + + if default_entry_path.exists() { + default_entry_path + } else { + return Err(ManifestError::MissingDefaultEntryFile { + toml: root_dir.join("Nargo.toml"), + entry: default_entry_path, + package_type, + }); + } }; - if entry_path.exists() { - Ok(Package { - root_dir: root_dir.to_path_buf(), - entry_path, - package_type, - name, - dependencies, - }) - } else { - Err(ManifestError::MissingEntryFile(entry_path, package_type)) - } + Ok(Package { + root_dir: root_dir.to_path_buf(), + entry_path, + package_type, + name, + dependencies, + }) } } @@ -120,6 +142,7 @@ struct PackageMetadata { name: Option, #[serde(alias = "type")] package_type: Option, + entry: Option, description: Option, authors: Option>, // If not compiler version is supplied, the latest is used diff --git a/crates/nargo_cli/tests/test_data/config.toml b/crates/nargo_cli/tests/test_data/config.toml index 61178563154..bc858bbc7f5 100644 --- a/crates/nargo_cli/tests/test_data/config.toml +++ b/crates/nargo_cli/tests/test_data/config.toml @@ -2,4 +2,4 @@ exclude = [] # List of tests (as their directory name) expecting to fail: if the test pass, we report an error. -fail = ["brillig_assert_fail", "dep_impl_primitive", "depend_on_bin", "workspace_fail", "workspace_missing_toml"] +fail = ["brillig_assert_fail", "custom_entry_not_found", "dep_impl_primitive", "depend_on_bin", "workspace_fail", "workspace_missing_toml"] diff --git a/crates/nargo_cli/tests/test_data/custom_entry/Nargo.toml b/crates/nargo_cli/tests/test_data/custom_entry/Nargo.toml new file mode 100644 index 00000000000..a8cc75072b1 --- /dev/null +++ b/crates/nargo_cli/tests/test_data/custom_entry/Nargo.toml @@ -0,0 +1,8 @@ +[package] +name = "custom_entry" +type = "bin" +entry = "src/foobarbaz.nr" +authors = [""] +compiler_version = "0.1" + +[dependencies] diff --git a/crates/nargo_cli/tests/test_data/custom_entry/Prover.toml b/crates/nargo_cli/tests/test_data/custom_entry/Prover.toml new file mode 100644 index 00000000000..4dd6b405159 --- /dev/null +++ b/crates/nargo_cli/tests/test_data/custom_entry/Prover.toml @@ -0,0 +1 @@ +x = "1" diff --git a/crates/nargo_cli/tests/test_data/custom_entry/src/foobarbaz.nr b/crates/nargo_cli/tests/test_data/custom_entry/src/foobarbaz.nr new file mode 100644 index 00000000000..00e94414c0b --- /dev/null +++ b/crates/nargo_cli/tests/test_data/custom_entry/src/foobarbaz.nr @@ -0,0 +1,3 @@ +fn main(x: Field) { + assert(x == 1); +} diff --git a/crates/nargo_cli/tests/test_data/custom_entry/target/custom_entry.json b/crates/nargo_cli/tests/test_data/custom_entry/target/custom_entry.json new file mode 100644 index 00000000000..2185644bd18 --- /dev/null +++ b/crates/nargo_cli/tests/test_data/custom_entry/target/custom_entry.json @@ -0,0 +1 @@ +{"backend":"acvm-backend-barretenberg","abi":{"parameters":[{"name":"x","type":{"kind":"field"},"visibility":"private"}],"param_witnesses":{"x":[1]},"return_type":null,"return_witnesses":[]},"bytecode":"H4sIAAAAAAAA/82SMQ7DIAxFTSAdexYbQzBbr1JUcv8jtAODRbPVSP2LEUjP/v7sALDDt7ZRH6PibyKnWIxHSr3ETkxPjLVJxpTbISSUJb+iMHdJUmqrBSsl7nTmyueAbYYs/2G4C//O2P9mx0I9r1fnMGWn328LPMHUZ97j/eLOtPmKkPwCbgC7D7vKd7DPCBXyr3fqphm13hKQ6RMhBQAA","proving_key":null,"verification_key":null} \ No newline at end of file diff --git a/crates/nargo_cli/tests/test_data/custom_entry/target/witness.tr b/crates/nargo_cli/tests/test_data/custom_entry/target/witness.tr new file mode 100644 index 00000000000..87be1158f1b Binary files /dev/null and b/crates/nargo_cli/tests/test_data/custom_entry/target/witness.tr differ diff --git a/crates/nargo_cli/tests/test_data/custom_entry_not_found/Nargo.toml b/crates/nargo_cli/tests/test_data/custom_entry_not_found/Nargo.toml new file mode 100644 index 00000000000..0ccb94aff1a --- /dev/null +++ b/crates/nargo_cli/tests/test_data/custom_entry_not_found/Nargo.toml @@ -0,0 +1,9 @@ +[package] +name = "custom_entry" +type = "bin" +# Testing that this file is missing and doesn't fallback to default `main.nr` file +entry = "src/foobarbaz.nr" +authors = [""] +compiler_version = "0.1" + +[dependencies] diff --git a/crates/nargo_cli/tests/test_data/custom_entry_not_found/Prover.toml b/crates/nargo_cli/tests/test_data/custom_entry_not_found/Prover.toml new file mode 100644 index 00000000000..4dd6b405159 --- /dev/null +++ b/crates/nargo_cli/tests/test_data/custom_entry_not_found/Prover.toml @@ -0,0 +1 @@ +x = "1" diff --git a/crates/nargo_cli/tests/test_data/custom_entry_not_found/src/main.nr b/crates/nargo_cli/tests/test_data/custom_entry_not_found/src/main.nr new file mode 100644 index 00000000000..00e94414c0b --- /dev/null +++ b/crates/nargo_cli/tests/test_data/custom_entry_not_found/src/main.nr @@ -0,0 +1,3 @@ +fn main(x: Field) { + assert(x == 1); +}