sable-frontmatter/src/toml.rs@main
raw
1
3use miette::{SourceOffset, SourceSpan};
4
5use crate::{Metadata, parse_simple};
6
7#[derive(Debug, miette::Diagnostic, thiserror::Error)]
9#[error("failed to deserialize toml frontmatter")]
10pub struct Error {
11 #[source_code]
13 src: String,
14 #[label("{err}")]
16 location: Option<SourceSpan>,
17
18 #[source]
20 err: Box<serde_toml::de::Error>,
21}
22
23pub fn parse(data: &str) -> Result<(Option<Metadata>, &str), Error> {
29 let (frontmatter, contents) = match parse_simple(data, "---") {
30 (Some(frontmatter), contents) => (frontmatter, contents),
31 (None, contents) => return Ok((None, contents)),
32 };
33
34 let parsed = match serde_toml::from_str(frontmatter) {
35 Ok(parsed) => parsed,
36 Err(err) => {
37 return Err(Error {
38 src: frontmatter.to_string(),
39 location: err.span().map(|span| {
40 SourceSpan::new(SourceOffset::from(span.start), span.end - span.start)
41 }),
42 err: Box::new(err),
43 });
44 }
45 };
46
47 Ok((Some(parsed), contents))
48}
49