()
| 5985 | } |
| 5986 | |
| 5987 | fn verify_generated_extension_surface() -> Result<()> { |
| 5988 | let manifest_path = Path::new(GENERATED_ASSETS_DIR).join("manifest.json"); |
| 5989 | let manifest_text = fs::read_to_string(&manifest_path) |
| 5990 | .with_context(|| format!("read {}", manifest_path.display()))?; |
| 5991 | let manifest: AssetManifestOut = |
| 5992 | serde_json::from_str(&manifest_text).context("parse committed asset manifest")?; |
| 5993 | let catalog_text = fs::read_to_string("assets/generated/extensions.catalog.json") |
| 5994 | .context("read assets/generated/extensions.catalog.json")?; |
| 5995 | let catalog: serde_json::Value = |
| 5996 | serde_json::from_str(&catalog_text).context("parse generated extension catalog")?; |
| 5997 | let generated = fs::read_to_string("src/pglite/generated_extensions.rs") |
| 5998 | .context("read src/pglite/generated_extensions.rs")?; |
| 5999 | |
| 6000 | let mut promoted_constants = BTreeMap::new(); |
| 6001 | for entry in catalog |
| 6002 | .get("extensions") |
| 6003 | .and_then(|value| value.as_array()) |
| 6004 | .ok_or_else(|| anyhow!("extension catalog is missing extensions array"))? |
| 6005 | { |
| 6006 | let promoted = entry |
| 6007 | .pointer("/promotion/promoted") |
| 6008 | .and_then(|value| value.as_bool()) |
| 6009 | .unwrap_or(false); |
| 6010 | if !promoted { |
| 6011 | continue; |
| 6012 | } |
| 6013 | let sql_name = entry |
| 6014 | .get("sql-name") |
| 6015 | .and_then(|value| value.as_str()) |
| 6016 | .ok_or_else(|| anyhow!("promoted extension is missing sql-name"))?; |
| 6017 | let rust_constant = entry |
| 6018 | .get("rust-constant") |
| 6019 | .and_then(|value| value.as_str()) |
| 6020 | .ok_or_else(|| anyhow!("promoted extension {sql_name} is missing rust-constant"))?; |
| 6021 | promoted_constants.insert(sql_name.to_owned(), rust_constant.to_owned()); |
| 6022 | } |
| 6023 | |
| 6024 | let manifest_sql_names = manifest |
| 6025 | .extensions |
| 6026 | .iter() |
| 6027 | .map(|extension| extension.sql_name.clone()) |
| 6028 | .collect::<BTreeSet<_>>(); |
| 6029 | let catalog_sql_names = promoted_constants.keys().cloned().collect::<BTreeSet<_>>(); |
| 6030 | if manifest_sql_names != catalog_sql_names { |
| 6031 | bail!( |
| 6032 | "promoted extension catalog and asset manifest disagree: manifest-only={:?} catalog-only={:?}", |
| 6033 | manifest_sql_names |
| 6034 | .difference(&catalog_sql_names) |
| 6035 | .collect::<Vec<_>>(), |
| 6036 | catalog_sql_names |
| 6037 | .difference(&manifest_sql_names) |
| 6038 | .collect::<Vec<_>>() |
| 6039 | ); |
| 6040 | } |
| 6041 | |
| 6042 | for extension in &manifest.extensions { |
| 6043 | let rust_constant = promoted_constants.get(&extension.sql_name).ok_or_else(|| { |
| 6044 | anyhow!( |
no test coverage detected