pub const VERSION_MARKER: &str = "PUERTO_RUNTIME_VERSION";
pub const RUNTIME_CRATES: &[&str] = &["puerto-core", "puerto-web", "puerto-sqlx"];
pub fn requirement(version: &str) -> String {
let mut parts = version.split('.');
match (parts.next(), parts.next()) {
(Some(major), Some(minor)) => format!("{major}.{minor}"),
_ => version.to_string(),
}
}
pub fn render_manifest(manifest: &str, version: &str) -> String {
manifest.replace(VERSION_MARKER, &requirement(version))
}
pub fn version_warnings(manifest: &str, cli_version: &str) -> Vec<String> {
let Ok(manifest) = manifest.parse::<toml::Table>() else {
return vec![];
};
let tables = [
manifest
.get("workspace")
.and_then(|w| w.get("dependencies")),
manifest.get("dependencies"),
];
let cli = requirement(cli_version);
let mut warnings = vec![];
for deps in tables.into_iter().flatten() {
for name in RUNTIME_CRATES {
let declared = match deps.get(*name) {
Some(toml::Value::String(v)) => v.as_str(),
Some(toml::Value::Table(t)) => match t.get("version") {
Some(toml::Value::String(v)) => v.as_str(),
_ => continue,
},
_ => continue,
};
let declared = requirement(declared.trim_start_matches(['^', '=', '~']));
if declared != cli {
warnings.push(format!(
"{name} {declared} but puerto {cli} — see the CHANGELOG migration guide"
));
}
}
}
warnings
}