use cargo_util_schemas::manifest::PackageName;
use crate::util::frontmatter::FrontmatterError;
use crate::util::frontmatter::ScriptSource;
pub(super) fn expand_manifest(content: &str) -> Result<String, FrontmatterError> {
let source = ScriptSource::parse(content)?;
if let Some(span) = source.frontmatter_span() {
match source.info() {
Some("cargo") | None => {}
Some(other) => {
let info_span = source.info_span().unwrap();
let close_span = source.close_span().unwrap();
if let Some(remainder) = other.strip_prefix("cargo,") {
return Err(FrontmatterError::new(
format!("unsupported frontmatter infostring attributes: `{remainder}`"),
info_span,
)
.push_visible_span(close_span));
} else {
return Err(FrontmatterError::new(
format!(
"unsupported frontmatter infostring `{other}`; specify `cargo` for embedding a manifest"
),
info_span,
).push_visible_span(close_span));
}
}
}
let mut frontmatter = content[0..span.end].to_owned();
let open_span = source.open_span().unwrap();
frontmatter.insert(open_span.start, '#');
Ok(frontmatter)
} else {
let span = source.shebang_span().unwrap_or(0..0);
Ok(content[span].to_owned())
}
}
pub fn sanitize_name(name: &str) -> String {
let placeholder = if name.contains('_') {
'_'
} else {
'-'
};
PackageName::sanitize(name, placeholder).into_inner()
}
#[cfg(test)]
mod test {
use snapbox::assert_data_eq;
use snapbox::str;
use super::*;
#[track_caller]
fn expand(source: &str) -> String {
expand_manifest(source).unwrap_or_else(|err| panic!("{}", err))
}
#[test]
fn expand_default() {
assert_data_eq!(expand(r#"fn main() {}"#), str![""]);
}
#[test]
fn expand_dependencies() {
assert_data_eq!(
expand(
r#"---cargo
[dependencies]
time="0.1.25"
---
fn main() {}
"#
),
str![[r##"
#---cargo
[dependencies]
time="0.1.25"
"##]]
);
}
}