#![doc = include_str!("../README.md")]
#![deny(missing_docs)]
mod parser;
pub mod table;
mod text;
pub mod types;
use {
crate::table::TomlTable,
std::{
fmt::{Debug, Display},
ops::Deref,
},
text::Span,
};
pub fn parse<'a>(str: &'a str) -> Result<Toml<'a>, TomlError<'a>> {
parser::parse_str(str)
}
#[derive(Debug)]
pub struct Toml<'a> {
source: &'a str,
table: TomlTable<'a>,
}
impl<'a> Toml<'a> {
pub fn new(str: &'a str) -> Result<Self, TomlError<'a>> {
parser::parse_str(str)
}
pub fn parse(str: &'a str) -> Result<Self, TomlError<'a>> {
parser::parse_str(str)
}
pub fn source(&self) -> &str {
self.source
}
}
impl<'a> From<Toml<'a>> for TomlTable<'a> {
fn from(value: Toml<'a>) -> TomlTable<'a> {
value.table
}
}
impl<'a> Deref for Toml<'a> {
type Target = TomlTable<'a>;
fn deref(&self) -> &Self::Target {
&self.table
}
}
pub struct TomlError<'a> {
pub src: Span<'a>,
pub kind: TomlErrorKind,
}
impl Debug for TomlError<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut start = self.src.source[..self.src.start].bytes().enumerate().rev();
let mut newlines = 3u8;
while newlines != 0 {
match start.next() {
None => break,
Some((_, b'\n')) => newlines -= 1,
_ => {}
}
}
let start = start.next().map(|(idx, _)| idx + 2).unwrap_or(0);
let mut end = self.src.source[self.src.end..].bytes().enumerate();
let mut newlines = 3u8;
while newlines != 0 {
match end.next() {
None => break,
Some((_, b'\n')) => newlines -= 1,
_ => {}
}
}
let end = end
.next()
.map(|(idx, _)| self.src.end + idx - 1)
.unwrap_or(self.src.source.len());
write!(
f,
"Error: {:?} at `{}`\nIn:\n{}",
self.kind,
self.src.as_str(),
&self.src.source[start..end]
)
}
}
impl Display for TomlError<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{self:?}")
}
}
#[derive(Debug, PartialEq, Eq)]
pub enum TomlErrorKind {
InvalidBareKey,
BareKeyHasSpace,
NoEqualsInAssignment,
NoKeyInAssignment,
NoValueInAssignment,
UnclosedBasicString,
UnclosedLiteralString,
UnclosedQuotedKey,
UnrecognisedValue,
ReusedKey,
NumberTooLarge,
NumberHasInvalidBase,
NumberHasLeadingZero,
InvalidNumber,
UnknownEscapeSequence,
UnknownUnicodeScalar,
UnclosedTableBracket,
UnclosedInlineTableBracket,
UnclosedArrayOfTablesBracket,
UnclosedArrayBracket,
NoCommaDelimeter,
DateTimeTooManyDigits,
DateMissingMonth,
DateMissingDay,
DateMissingDash,
TimeMissingMinute,
TimeMissingSecond,
TimeMissingColon,
OffsetMissingHour,
OffsetMissingMinute,
}
pub mod prelude {
pub use crate::{
Toml, TomlError, TomlErrorKind,
table::{TomlGetError, TomlTable},
types::{
OffsetTomlDateTime, TomlArray, TomlDate, TomlDateTime, TomlOffset, TomlTime, TomlValue,
TomlValueType,
},
};
}