use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "kebab-case")]
pub enum SourceFormat {
Man,
Mdoc,
Markdown,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct DocumentSource {
pub format: SourceFormat,
#[serde(skip_serializing_if = "Option::is_none")]
pub path: Option<String>,
}
#[derive(
Debug,
Clone,
Copy,
Default,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Serialize,
Deserialize,
JsonSchema,
)]
#[serde(transparent)]
pub struct TextSize(u32);
impl TextSize {
#[must_use]
pub const fn new(value: u32) -> Self {
Self(value)
}
#[must_use]
pub const fn get(self) -> u32 {
self.0
}
#[must_use]
pub fn from_usize_saturating(value: usize) -> Self {
Self(u32::try_from(value).unwrap_or(u32::MAX))
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct TextRange {
pub start: TextSize,
pub end: TextSize,
}
impl TextRange {
#[must_use]
pub fn new(start: TextSize, end: TextSize) -> Self {
assert!(start <= end, "a source range cannot end before it starts");
Self { start, end }
}
#[must_use]
pub const fn is_empty(self) -> bool {
self.start.0 == self.end.0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct SourceSpan {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub byte_range: Option<TextRange>,
pub line: u32,
pub column: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_line: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_column: Option<u32>,
}