fml 0.5.0

Friendly Markup Language
Documentation
use super::{FmlFunction, FmlValue, Quote};
use crate::ast::{
	FmlValues, FunctionToken, Token,
	token::{self, Tokens},
};
use chumsky::Parser;

impl TryFrom<Token> for FmlValue {
	type Error = ();

	fn try_from(value: Token) -> Result<Self, Self::Error> {
		Ok(match value {
			Token::Linebreak => Self::Linebreak,
			Token::CodeBlock { lang, body } => Self::CodeBlock { lang, body },
			Token::CodeInline(s) => Self::CodeInline(s),
			Token::Heading1(tokens) => Self::Heading1(tokens.try_into()?),
			Token::Heading2(tokens) => Self::Heading2(tokens.try_into()?),
			Token::Heading3(tokens) => Self::Heading3(tokens.try_into()?),
			Token::SupLine(tokens) => Self::Superline(tokens.try_into()?),
			Token::SubLine(tokens) => Self::Subline(tokens.try_into()?),
			Token::ListItem(tokens) => Self::ListItem(tokens.try_into()?),
			Token::Quote(s) => {
				let p = crate::parser::functions::fml_values();
				let tokens = p.parse(&s).into_result().map_err(|_| ())?;
				let values = tokens.try_into()?;
				Quote(values)
			}
			Token::CwSpoiler(tokens) => Self::ContentWarning {
				reason: "Spoilers".into(),
				body: tokens.try_into()?,
			},
			Token::Hyperlink { fml, uri } => Self::Hyperlink {
				fml: fml.try_into()?,
				uri,
			},
			Token::Bold(tokens) => Self::Bold(tokens.try_into()?),
			Token::Italic(tokens) => Self::Italic(tokens.try_into()?),
			Token::Strikethrough(tokens) => Self::Strikethrough(tokens.try_into()?),
			Token::Underline(tokens) => Self::Underline(tokens.try_into()?),
			Token::Superscript(tokens) => Self::Superscript(tokens.try_into()?),
			Token::Subscript(tokens) => Self::Subscript(tokens.try_into()?),
			Token::Function(FunctionToken { name, params, body }) => FmlFunction {
				name,
				params,
				body: body.try_into()?,
			}
			.interpret(),
			Token::Typst(s) => Self::Typst(s),
			Token::Text(s) => Self::Text(s),
		})
	}
}

impl TryFrom<Tokens> for FmlValues {
	type Error = ();

	fn try_from(tokens: Tokens) -> Result<Self, Self::Error> {
		let mut vec = vec![];
		for t in tokens.0 {
			vec.push(t.try_into()?);
		}
		Ok(Self(vec))
	}
}