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 {
pub role: Option<Role>,
pub id: Option<String>,
pub form: Form,
pub content: Vec<InlineNode>,
pub location: Location,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Superscript {
pub role: Option<Role>,
pub id: Option<String>,
pub form: Form,
pub content: Vec<InlineNode>,
pub location: Location,
}
#[derive(Clone, Debug, PartialEq)]
pub struct CurvedQuotation {
pub role: Option<Role>,
pub id: Option<String>,
pub form: Form,
pub content: Vec<InlineNode>,
pub location: Location,
}
#[derive(Clone, Debug, PartialEq)]
pub struct CurvedApostrophe {
pub role: Option<Role>,
pub id: Option<String>,
pub form: Form,
pub content: Vec<InlineNode>,
pub location: Location,
}
#[derive(Clone, Debug, PartialEq)]
pub struct StandaloneCurvedApostrophe {
pub location: Location,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Monospace {
pub role: Option<Role>,
pub id: Option<String>,
pub form: Form,
pub content: Vec<InlineNode>,
pub location: Location,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Highlight {
pub role: Option<Role>,
pub id: Option<String>,
pub form: Form,
pub content: Vec<InlineNode>,
pub location: Location,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Bold {
pub role: Option<Role>,
pub id: Option<String>,
pub form: Form,
pub content: Vec<InlineNode>,
pub location: Location,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Italic {
pub role: Option<Role>,
pub id: Option<String>,
pub form: Form,
pub content: Vec<InlineNode>,
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 {
pub content: String,
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 {
pub content: String,
pub location: Location,
pub subs: Vec<Substitution>,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Verbatim {
pub content: String,
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()
}
}