use std::ops::Range;
#[derive(
// std
Clone,
Copy,
Debug,
Eq,
PartialEq,
// serde
serde::Deserialize,
serde::Serialize,
// getset
getset::Getters,
getset::CopyGetters,
getset::MutGetters,
getset::Setters,
// other
bon::Builder
)]
#[serde(rename_all = "camelCase")]
pub struct StringRange {
#[serde(default)]
#[getset(get = "pub", set = "pub", get_mut = "pub")]
pub start_offset: u32,
#[serde(default)]
#[getset(get = "pub", set = "pub", get_mut = "pub")]
pub end_offset: u32,
}
impl StringRange {
#[must_use]
pub const fn new(start_offset: u32, end_offset: u32) -> Self {
Self {
start_offset,
end_offset,
}
}
#[must_use]
pub const fn start(self) -> u32 {
self.start_offset
}
#[must_use]
pub const fn end(self) -> u32 {
self.end_offset
}
#[must_use]
pub const fn len(self) -> u32 {
self.end_offset - self.start_offset
}
#[must_use]
pub const fn is_empty(self) -> bool {
self.start_offset == self.end_offset
}
#[must_use]
pub const fn range(self) -> Range<usize> {
(self.start_offset as usize)..(self.end_offset as usize)
}
}
impl From<Range<usize>> for StringRange {
fn from(range: Range<usize>) -> Self {
Self {
start_offset: u32::try_from(range.start).unwrap_or_default(),
end_offset: u32::try_from(range.end).unwrap_or_default(),
}
}
}
impl From<&Range<usize>> for StringRange {
fn from(range: &Range<usize>) -> Self {
Self {
start_offset: u32::try_from(range.start).unwrap_or_default(),
end_offset: u32::try_from(range.end).unwrap_or_default(),
}
}
}
impl TryFrom<StringRange> for Range<usize> {
type Error = std::num::TryFromIntError;
fn try_from(string_range: StringRange) -> Result<Self, Self::Error> {
Ok(Self {
start: string_range.start_offset.try_into()?,
end: string_range.end_offset.try_into()?,
})
}
}
impl TryFrom<&StringRange> for Range<usize> {
type Error = std::num::TryFromIntError;
fn try_from(string_range: &StringRange) -> Result<Self, Self::Error> {
Ok(Self {
start: string_range.start_offset.try_into()?,
end: string_range.end_offset.try_into()?,
})
}
}
impl std::fmt::Display for StringRange {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "[{}..{}]", self.start_offset, self.end_offset)
}
}