use std::fmt;
#[cfg(feature = "markdown")]
pub mod dialect;
pub mod extension;
#[cfg(feature = "markdown")]
pub mod spans;
pub mod plain;
pub mod headless;
pub mod table;
pub const FENCE: &str = "+++";
pub const MAX_ENVELOPE_BYTES: usize = 64 * 1024;
pub const FENCE_PADDING_LIMIT: usize = 64;
pub const CLOSING_FENCE_SLACK: usize = FENCE.len() + FENCE_PADDING_LIMIT + 2;
pub const SCAN_WINDOW_BYTES: usize = MAX_ENVELOPE_BYTES + CLOSING_FENCE_SLACK;
fn scan_window(rest: &str) -> &str {
let mut end = SCAN_WINDOW_BYTES.min(rest.len());
while end > 0 && !rest.is_char_boundary(end) {
end -= 1;
}
&rest[..end]
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum EnvelopeError {
Unclosed,
Oversized {
bytes: usize,
},
BodyOpensAnEnvelope,
FrontMatterContainsFence,
}
impl fmt::Display for EnvelopeError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Unclosed => {
write!(f, "front-matter opened with `{FENCE}` but never closed")
}
Self::Oversized { bytes } => write!(
f,
"front-matter is {bytes} bytes; the envelope limit is {MAX_ENVELOPE_BYTES}"
),
Self::BodyOpensAnEnvelope => write!(
f,
"the body itself opens a `{FENCE}` envelope — assembling it would \
make stripping non-idempotent"
),
Self::FrontMatterContainsFence => write!(
f,
"the front matter contains a `{FENCE}` line, which would read as \
its closing fence"
),
}
}
}
impl std::error::Error for EnvelopeError {}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SplitDocument<'a> {
pub front_matter: Option<&'a str>,
pub body: &'a str,
}
pub fn split_newt_metadata(text: &str) -> Result<SplitDocument<'_>, EnvelopeError> {
let after_bom = text.strip_prefix('\u{feff}').unwrap_or(text);
let Some(rest) = after_bom.strip_prefix(FENCE) else {
return Ok(SplitDocument {
front_matter: None,
body: text,
});
};
let rest = match rest.strip_prefix('\n') {
Some(r) => r,
None => match rest.strip_prefix("\r\n") {
Some(r) => r,
None if rest.is_empty() => "",
None => {
return Ok(SplitDocument {
front_matter: None,
body: text,
})
}
},
};
let window = scan_window(rest);
let truncated = window.len() < rest.len();
for (idx, line) in LineOffsets::new(window) {
if idx > MAX_ENVELOPE_BYTES {
return Err(EnvelopeError::Oversized { bytes: idx });
}
if truncated && !line.ends_with('\n') {
break;
}
if line.trim_end_matches(['\r', '\n']).trim() == FENCE {
debug_assert!(idx <= MAX_ENVELOPE_BYTES);
let front_matter = &rest[..idx];
return Ok(SplitDocument {
front_matter: Some(front_matter),
body: &rest[idx + line.len()..],
});
}
}
if rest.len() > MAX_ENVELOPE_BYTES {
return Err(EnvelopeError::Oversized { bytes: rest.len() });
}
Err(EnvelopeError::Unclosed)
}
pub fn strip_newt_metadata(text: &str) -> Result<&str, EnvelopeError> {
Ok(split_newt_metadata(text)?.body)
}
pub fn assemble_newt_metadata(front_matter: &str, body: &str) -> Result<String, EnvelopeError> {
let newline = if front_matter.is_empty() || front_matter.ends_with('\n') {
""
} else {
"\n"
};
let span = front_matter.len() + newline.len();
if span > MAX_ENVELOPE_BYTES {
return Err(EnvelopeError::Oversized { bytes: span });
}
if front_matter
.lines()
.any(|l| l.trim_end_matches('\r').trim() == FENCE)
{
return Err(EnvelopeError::FrontMatterContainsFence);
}
if !matches!(
split_newt_metadata(body),
Ok(SplitDocument {
front_matter: None,
..
})
) {
return Err(EnvelopeError::BodyOpensAnEnvelope);
}
Ok(format!("{FENCE}\n{front_matter}{newline}{FENCE}\n{body}"))
}
struct LineOffsets<'a> {
rest: &'a str,
offset: usize,
}
impl<'a> LineOffsets<'a> {
fn new(s: &'a str) -> Self {
Self { rest: s, offset: 0 }
}
}
impl<'a> Iterator for LineOffsets<'a> {
type Item = (usize, &'a str);
fn next(&mut self) -> Option<Self::Item> {
if self.rest.is_empty() {
return None;
}
let end = match self.rest.find('\n') {
Some(i) => i + 1,
None => self.rest.len(),
};
let line = &self.rest[..end];
let start = self.offset;
self.offset += end;
self.rest = &self.rest[end..];
Some((start, line))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn round_trip_preserves_front_matter_and_body() {
let fm = "role = \"navigator\"\ntier = 2\n";
let body = "# Prompt\n\nDo the thing.\n";
let doc = assemble_newt_metadata(fm, body).unwrap();
let split = split_newt_metadata(&doc).unwrap();
assert_eq!(split.front_matter, Some(fm));
assert_eq!(split.body, body);
let doc2 = assemble_newt_metadata("a = 1", body).unwrap();
assert_eq!(
split_newt_metadata(&doc2).unwrap().front_matter,
Some("a = 1\n")
);
}
#[test]
fn strip_is_idempotent_on_valid_documents() {
let doc = assemble_newt_metadata("a = 1\n", "body text\nmore\n").unwrap();
let once = strip_newt_metadata(&doc).unwrap();
let twice = strip_newt_metadata(once).unwrap();
assert_eq!(once, "body text\nmore\n");
assert_eq!(once, twice, "stripping a stripped document is a no-op");
let plain = "just markdown\n\n+++ not at the start\n";
assert_eq!(strip_newt_metadata(plain).unwrap(), plain);
}
#[test]
fn strip_is_byte_preserving_outside_the_envelope() {
let body = " leading spaces kept\r\ntrailing too \n\n";
let doc = format!("+++\na = 1\n+++\n{body}");
assert_eq!(strip_newt_metadata(&doc).unwrap(), body);
}
#[test]
fn body_metadata_lookalikes_never_activate() {
for body in [
"text\n+++\nrole = \"x\"\n+++\n",
"```\n+++\ninside a code fence\n+++\n```\n",
"> +++\n> quoted\n> +++\n",
] {
assert_eq!(
strip_newt_metadata(body).unwrap(),
body,
"a mid-document fence must never activate: {body:?}"
);
}
}
#[test]
fn a_leading_blank_line_means_no_front_matter() {
for doc in [
"\n+++\na = 1\n+++\nbody\n",
"\r\n+++\na = 1\n+++\nbody\n",
" +++\na = 1\n+++\nbody\n",
] {
let split = split_newt_metadata(doc).unwrap();
assert_eq!(split.front_matter, None, "no envelope for {doc:?}");
assert_eq!(split.body, doc, "byte-identical passthrough for {doc:?}");
}
}
#[test]
fn assemble_refuses_a_fence_leading_body() {
for body in [
"+++\nb = 2\n+++\nmore\n",
"+++\r\nb = 2\r\n+++\r\nmore\r\n",
"\u{feff}+++\nb = 2\n+++\nmore\n",
"+++\nb = 2\nnever closed\n",
] {
assert_eq!(
assemble_newt_metadata("a = 1\n", body),
Err(EnvelopeError::BodyOpensAnEnvelope),
"must refuse an envelope-opening body: {body:?}"
);
}
for body in [" +++ \nrest\n", "+++ \nrest\n", "+++toml\nrest\n"] {
let doc = assemble_newt_metadata("a = 1\n", body)
.unwrap_or_else(|e| panic!("lookalike body must be accepted ({body:?}): {e}"));
assert_eq!(strip_newt_metadata(&doc).unwrap(), body);
assert_eq!(
strip_newt_metadata(body).unwrap(),
body,
"and stripping it again is a no-op — the lint's whole point"
);
}
}
#[test]
fn the_envelope_bound_is_the_terminated_span() {
let exact_unterminated = "x".repeat(MAX_ENVELOPE_BYTES);
assert!(
matches!(
assemble_newt_metadata(&exact_unterminated, "body\n"),
Err(EnvelopeError::Oversized { bytes }) if bytes == MAX_ENVELOPE_BYTES + 1
),
"a newline must be supplied, so the terminated span is over the limit"
);
let fits = "x".repeat(MAX_ENVELOPE_BYTES - 1);
let doc = assemble_newt_metadata(&fits, "body\n").unwrap();
let split = split_newt_metadata(&doc).unwrap();
assert_eq!(split.front_matter.unwrap().len(), MAX_ENVELOPE_BYTES);
assert_eq!(split.body, "body\n");
let at_bound = format!("+++\n{}\n+++\nbody\n", "x".repeat(MAX_ENVELOPE_BYTES - 1));
assert_eq!(
split_newt_metadata(&at_bound)
.unwrap()
.front_matter
.unwrap()
.len(),
MAX_ENVELOPE_BYTES
);
let over = format!("+++\n{}\n+++\nbody\n", "x".repeat(MAX_ENVELOPE_BYTES));
assert!(matches!(
split_newt_metadata(&over),
Err(EnvelopeError::Oversized { bytes }) if bytes == MAX_ENVELOPE_BYTES + 1
));
let exact_terminated = format!("{}\n", "x".repeat(MAX_ENVELOPE_BYTES - 1));
let doc = assemble_newt_metadata(&exact_terminated, "body\n").unwrap();
assert_eq!(
split_newt_metadata(&doc).unwrap().front_matter,
Some(exact_terminated.as_str())
);
}
#[test]
fn split_consumes_only_the_first_envelope() {
let doc = "+++\na = 1\n+++\n+++\nb = 2\n+++\nreal body\n";
let split = split_newt_metadata(doc).unwrap();
assert_eq!(split.front_matter, Some("a = 1\n"));
assert_eq!(split.body, "+++\nb = 2\n+++\nreal body\n");
assert_eq!(
assemble_newt_metadata("a = 1\n", split.body),
Err(EnvelopeError::BodyOpensAnEnvelope),
"assemble lints away the shape that would break idempotence"
);
}
#[test]
fn the_closing_fence_scan_reads_at_most_one_window() {
let hostile = "x".repeat(MAX_ENVELOPE_BYTES * 4);
assert!(
scan_window(&hostile).len() <= SCAN_WINDOW_BYTES,
"the scanner was handed {} bytes, window is {SCAN_WINDOW_BYTES}",
scan_window(&hostile).len()
);
assert_eq!(scan_window("a = 1\n+++\n").len(), "a = 1\n+++\n".len());
let multibyte = "\u{2298}".repeat(MAX_ENVELOPE_BYTES);
let window = scan_window(&multibyte);
assert!(window.len() <= SCAN_WINDOW_BYTES);
assert!(multibyte.starts_with(window), "the window is a real prefix");
}
#[test]
fn a_fence_line_straddling_the_window_is_not_found() {
let padding = " ".repeat(FENCE_PADDING_LIMIT * 4);
let doc = format!(
"+++\n{}\n+++{padding}\nbody\n",
"x".repeat(MAX_ENVELOPE_BYTES - 1)
);
assert!(
matches!(
split_newt_metadata(&doc),
Err(EnvelopeError::Oversized { .. })
),
"an over-padded fence is not honored, and the envelope is over the limit"
);
}
#[test]
fn an_unclosed_fence_fails_closed() {
assert_eq!(
split_newt_metadata("+++\na = 1\nno closing fence\n"),
Err(EnvelopeError::Unclosed)
);
assert_eq!(split_newt_metadata("+++"), Err(EnvelopeError::Unclosed));
assert_eq!(split_newt_metadata("+++\n"), Err(EnvelopeError::Unclosed));
}
#[test]
fn an_oversized_envelope_is_malformed() {
let big = "x = 1\n".repeat(MAX_ENVELOPE_BYTES / 6 + 1);
let doc = format!("+++\n{big}+++\nbody\n");
assert!(matches!(
split_newt_metadata(&doc),
Err(EnvelopeError::Oversized { .. })
));
let hostile = format!("+++\n{big}");
assert!(matches!(
split_newt_metadata(&hostile),
Err(EnvelopeError::Oversized { .. })
));
assert!(matches!(
assemble_newt_metadata(&big, "body\n"),
Err(EnvelopeError::Oversized { .. })
));
let at_bound = format!("{}\n", "x".repeat(MAX_ENVELOPE_BYTES - 1));
assert!(assemble_newt_metadata(&at_bound, "body\n").is_ok());
}
#[test]
fn bom_and_crlf_fences_still_split() {
let doc = "\u{feff}+++\r\na = 1\r\n+++\r\nbody\r\n";
let split = split_newt_metadata(doc).unwrap();
assert_eq!(split.front_matter, Some("a = 1\r\n"));
assert_eq!(split.body, "body\r\n");
let plain = "\u{feff}no fence\n";
assert_eq!(strip_newt_metadata(plain).unwrap(), plain);
}
#[test]
fn a_fence_with_trailing_garbage_is_body_not_envelope() {
let doc = "+++toml\na = 1\n+++\nbody\n";
let split = split_newt_metadata(doc).unwrap();
assert_eq!(split.front_matter, None);
assert_eq!(split.body, doc);
}
#[test]
fn assemble_refuses_a_fence_bearing_front_matter() {
assert_eq!(
assemble_newt_metadata("a = 1\n+++\nb = 2\n", "body\n"),
Err(EnvelopeError::FrontMatterContainsFence)
);
assert_eq!(
assemble_newt_metadata("a = 1\n +++ \n", "body\n"),
Err(EnvelopeError::FrontMatterContainsFence)
);
}
#[test]
fn errors_render_actionable_text() {
assert_eq!(
EnvelopeError::Unclosed.to_string(),
"front-matter opened with `+++` but never closed"
);
assert!(EnvelopeError::Oversized { bytes: 70_000 }
.to_string()
.contains("65536"));
}
}