Generate contract crates under `output_dir`: - `contracts-generated/ /` per-contract crates - `contracts-facade/` facade crate that re-exports all contracts
(self, artifacts_dir: &Path, output_dir: &Path)
| 92 | /// - `contracts-generated/<name>/` per-contract crates |
| 93 | /// - `contracts-facade/` facade crate that re-exports all contracts |
| 94 | pub fn generate(self, artifacts_dir: &Path, output_dir: &Path) -> Result<()> { |
| 95 | let contracts_generated_dir = output_dir.join("contracts-generated"); |
| 96 | let facade_dir = output_dir.join("contracts-facade"); |
| 97 | |
| 98 | std::fs::create_dir_all(&contracts_generated_dir)?; |
| 99 | std::fs::create_dir_all(&facade_dir)?; |
| 100 | |
| 101 | // Collect all contracts with their submodule association, then |
| 102 | // generate crates in parallel. |
| 103 | let entries: Vec<CrateEntry> = self |
| 104 | .contracts |
| 105 | .iter() |
| 106 | .map(|c| (c, None)) |
| 107 | .chain( |
| 108 | self.submodules |
| 109 | .iter() |
| 110 | .flat_map(|s| s.contracts.iter().map(move |c| (c, Some(s.name.clone())))), |
| 111 | ) |
| 112 | .collect::<Vec<_>>() |
| 113 | .into_par_iter() |
| 114 | .map(|(contract, submodule)| { |
| 115 | contract.write_crate(artifacts_dir, &contracts_generated_dir)?; |
| 116 | Ok(CrateEntry { |
| 117 | contract_name: contract.name.clone(), |
| 118 | crate_name: to_crate_name(&contract.name), |
| 119 | dir_name: to_dir_name(&contract.name), |
| 120 | submodule, |
| 121 | }) |
| 122 | }) |
| 123 | .collect::<Result<Vec<_>>>()?; |
| 124 | |
| 125 | let mut entries = entries; |
| 126 | entries.sort_by_key(|entry| entry.crate_name.clone()); |
| 127 | |
| 128 | // Generate the facade crate |
| 129 | write_facade_lib(&entries, &facade_dir)?; |
| 130 | write_facade_cargo_toml(&entries, &facade_dir)?; |
| 131 | |
| 132 | Ok(()) |
| 133 | } |
| 134 | } |
| 135 | |
| 136 | /// Generate the facade crate's lib.rs file. |
no test coverage detected