use std::{fmt::Display, str::FromStr};
use winnow::{
ModalResult, Parser,
error::{ContextError, StrContext},
stream::AsChar,
token::take_till,
};
use crate::roles::SphinxType;
#[derive(Debug, PartialEq)]
pub enum CppRole {
Enum,
Enumerator,
Class,
Union,
Concept,
Function,
FunctionParam,
Member,
TemplateParam,
Type,
}
impl Display for CppRole {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(match self {
CppRole::Enumerator => "enumerator",
CppRole::Enum => "enum",
CppRole::Class => "class",
CppRole::Function => "function",
CppRole::FunctionParam => "functionParam",
CppRole::Member => "member",
CppRole::TemplateParam => "templateParam",
CppRole::Type => "type",
CppRole::Union => "union",
CppRole::Concept => "concept",
})
}
}
impl FromStr for CppRole {
type Err = ContextError;
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
match s {
"class" => Ok(CppRole::Class),
"enumerator" => Ok(CppRole::Enumerator),
"enum" => Ok(CppRole::Enum),
"function" => Ok(CppRole::Function),
"functionParam" => Ok(CppRole::FunctionParam),
"member" => Ok(CppRole::Member),
"templateParam" => Ok(CppRole::TemplateParam),
"concept" => Ok(CppRole::Concept),
"union" => Ok(CppRole::Union),
"type" => Ok(CppRole::Type),
_ => Err(ContextError::new()),
}
}
}
pub(crate) fn cpp_role(input: &mut &str) -> ModalResult<SphinxType> {
let role = take_till(1.., AsChar::is_space)
.context(StrContext::Label("Cpp Role"))
.parse_to()
.parse_next(input)?;
Ok(SphinxType::Cpp(role))
}