xtask/
release_versions_identifiers.rs1use anyhow::{bail, Context, Result};
2
3use super::{parse_json_value, read_json_version, write_json_preserving_prefix};
4
5pub(super) fn read_oci_identifier_version(content: &str, pointer: Option<&str>) -> Result<String> {
6 let identifier = read_json_version(content, pointer)?;
7 identifier
8 .rsplit_once(':')
9 .map(|(_, version)| version.to_owned())
10 .with_context(|| format!("OCI identifier {identifier:?} has no version tag suffix"))
11}
12
13pub(super) fn read_npm_identifier_version(content: &str, pointer: Option<&str>) -> Result<String> {
14 let identifier = read_json_version(content, pointer)?;
15 identifier
16 .rsplit_once('@')
17 .and_then(|(package, version)| (!package.is_empty()).then(|| version.to_owned()))
18 .with_context(|| format!("npm identifier {identifier:?} has no version suffix"))
19}
20
21pub(super) fn replace_oci_identifier_version(
22 content: &str,
23 pointer: Option<&str>,
24 next: &str,
25) -> Result<String> {
26 let pointer = pointer.context("oci_identifier_version requires json_pointer")?;
27 let mut value = parse_json_value(content)?;
28 let target = value
29 .pointer_mut(pointer)
30 .with_context(|| format!("missing JSON OCI identifier at {pointer}"))?;
31 let identifier = target
32 .as_str()
33 .with_context(|| format!("JSON OCI identifier at {pointer} is not a string"))?;
34 let Some((repo, _)) = identifier.rsplit_once(':') else {
35 bail!("OCI identifier {identifier:?} has no version tag suffix");
36 };
37 *target = serde_json::Value::String(format!("{repo}:{next}"));
38 write_json_preserving_prefix(content, &value)
39}
40
41pub(super) fn replace_npm_identifier_version(
42 content: &str,
43 pointer: Option<&str>,
44 next: &str,
45) -> Result<String> {
46 let pointer = pointer.context("npm_identifier_version requires json_pointer")?;
47 let mut value = parse_json_value(content)?;
48 let target = value
49 .pointer_mut(pointer)
50 .with_context(|| format!("missing JSON npm identifier at {pointer}"))?;
51 let identifier = target
52 .as_str()
53 .with_context(|| format!("JSON npm identifier at {pointer} is not a string"))?;
54 let Some((package, _)) = identifier.rsplit_once('@') else {
55 bail!("npm identifier {identifier:?} has no version suffix");
56 };
57 if package.is_empty() {
58 bail!("npm identifier {identifier:?} has no package name");
59 }
60 *target = serde_json::Value::String(format!("{package}@{next}"));
61 write_json_preserving_prefix(content, &value)
62}