Skip to main content

xtask/
release_versions_identifiers.rs

1use 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}