use serde::{
Serialize,
ser::{SerializeMap, Serializer},
};
use crate::{Location, Role, Substitution};
use super::InlineNode;
#[derive(Clone, Debug, PartialEq, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum Form {
Constrained,
Unconstrained,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Subscript<'a> {
pub role: Option<Role<'a>>,
pub id: Option<&'a str>,
pub form: Form,
pub content: Vec<InlineNode<'a>>,
pub location: Location,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Superscript<'a> {
pub role: Option<Role<'a>>,
pub id: Option<&'a str>,
pub form: Form,
pub content: Vec<InlineNode<'a>>,
pub location: Location,
}
#[derive(Clone, Debug, PartialEq)]
pub struct CurvedQuotation<'a> {
pub role: Option<Role<'a>>,
pub id: Option<&'a str>,
pub form: Form,
pub content: Vec<InlineNode<'a>>,
pub location: Location,
}
#[derive(Clone, Debug, PartialEq)]
pub struct CurvedApostrophe<'a> {
pub role: Option<Role<'a>>,
pub id: Option<&'a str>,
pub form: Form,
pub content: Vec<InlineNode<'a>>,
pub location: Location,
}
#[derive(Clone, Debug, PartialEq)]
pub struct StandaloneCurvedApostrophe {
pub location: Location,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Monospace<'a> {
pub role: Option<Role<'a>>,
pub id: Option<&'a str>,
pub form: Form,
pub content: Vec<InlineNode<'a>>,
pub location: Location,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Highlight<'a> {
pub role: Option<Role<'a>>,
pub id: Option<&'a str>,
pub form: Form,
pub content: Vec<InlineNode<'a>>,
pub location: Location,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Bold<'a> {
pub role: Option<Role<'a>>,
pub id: Option<&'a str>,
pub form: Form,
pub content: Vec<InlineNode<'a>>,
pub location: Location,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Italic<'a> {
pub role: Option<Role<'a>>,
pub id: Option<&'a str>,
pub form: Form,
pub content: Vec<InlineNode<'a>>,
pub location: Location,
}
#[derive(Clone, Debug, PartialEq)]
pub struct LineBreak {
pub location: Location,
}
impl Serialize for LineBreak {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut state = serializer.serialize_map(Some(3))?;
state.serialize_entry("name", "linebreak")?;
state.serialize_entry("type", "string")?;
state.serialize_entry("location", &self.location)?;
state.end()
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct Plain<'a> {
pub content: &'a str,
pub location: Location,
pub escaped: bool,
}
impl Serialize for Plain<'_> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut state = serializer.serialize_map(Some(4))?;
state.serialize_entry("name", "text")?;
state.serialize_entry("type", "string")?;
state.serialize_entry("value", &self.content)?;
state.serialize_entry("location", &self.location)?;
state.end()
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct Raw<'a> {
pub content: &'a str,
pub location: Location,
pub subs: Vec<Substitution>,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Verbatim<'a> {
pub content: &'a str,
pub location: Location,
}
impl Serialize for StandaloneCurvedApostrophe {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut state = serializer.serialize_map(Some(3))?;
state.serialize_entry("name", "curved_apostrophe")?;
state.serialize_entry("type", "string")?;
state.serialize_entry("location", &self.location)?;
state.end()
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum CalloutRefKind {
Explicit,
Auto,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct CalloutRef {
pub kind: CalloutRefKind,
pub number: usize,
pub location: Location,
}
impl CalloutRef {
#[must_use]
pub fn explicit(number: usize, location: Location) -> Self {
Self {
kind: CalloutRefKind::Explicit,
number,
location,
}
}
#[must_use]
pub fn auto(number: usize, location: Location) -> Self {
Self {
kind: CalloutRefKind::Auto,
number,
location,
}
}
}
impl Serialize for CalloutRef {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut state = serializer.serialize_map(Some(5))?;
state.serialize_entry("name", "callout_reference")?;
state.serialize_entry("type", "inline")?;
state.serialize_entry("variant", &self.kind)?;
state.serialize_entry("number", &self.number)?;
state.serialize_entry("location", &self.location)?;
state.end()
}
}