use std::borrow::Cow;
#[derive(Clone, Copy, Default, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Visibility {
#[default]
Public,
Private,
}
#[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Module(Cow<'static, str>);
impl Module {
#[must_use]
pub fn from_string(s: impl Into<String>) -> Self {
Self(Cow::from(s.into()))
}
#[must_use]
pub const fn from_str(s: &'static str) -> Self {
Self(Cow::Borrowed(s))
}
}
#[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum FileEmission {
Common,
Default,
CustomModule(Module),
}
#[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Emission {
Builtin,
FileEmission(FileEmission),
External,
}
impl Emission {
#[must_use]
pub fn file_emission(&self) -> Option<&FileEmission> {
match self {
Self::FileEmission(fe) => Some(fe),
_ => None,
}
}
}
#[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Docs {
pub lines: Vec<String>,
}
impl Docs {
#[must_use]
pub fn empty() -> Self {
Self::default()
}
#[must_use]
pub fn from_line(joined_line: &str) -> Self {
if joined_line.is_empty() {
Self::empty()
} else {
Self { lines: joined_line.split('\n').map(std::string::ToString::to_string).collect() }
}
}
#[must_use]
pub const fn from_lines(lines: Vec<String>) -> Self {
Self { lines }
}
}
#[must_use]
pub fn common_or_module_emission(x: &[Emission]) -> Emission {
if x.iter().all(|x| matches!(x, Emission::Builtin | Emission::FileEmission(FileEmission::Common))) {
Emission::FileEmission(FileEmission::Common)
} else if x.iter().any(|x| matches!(x, Emission::FileEmission(FileEmission::CustomModule(_)))) {
Emission::FileEmission(FileEmission::CustomModule(Module::from_string("")))
} else {
Emission::FileEmission(FileEmission::Default)
}
}