use crate::display::SegmentDisplay;
use std::ops::Range;
use super::{Field, Separators};
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub struct Segment<'m> {
pub(crate) source: &'m str,
pub name: &'m str,
pub fields: Vec<Field<'m>>,
pub range: Range<usize>,
}
impl<'m> Segment<'m> {
#[inline]
pub fn fields(&self) -> impl Iterator<Item = &Field<'m>> {
self.fields.iter()
}
#[inline]
pub fn display(&'m self, separators: &'m Separators) -> SegmentDisplay<'m> {
SegmentDisplay {
name: self.name,
fields: &self.fields,
separators,
}
}
#[inline]
pub fn raw_value(&self) -> &'m str {
self.source
}
#[inline]
pub fn field(&self, number: usize) -> Option<&Field<'m>> {
debug_assert!(number > 0, "Field numbers are 1-indexed");
self.fields.get(number - 1)
}
}