diff options
Diffstat (limited to 'vendor/miette/src/named_source.rs')
-rw-r--r-- | vendor/miette/src/named_source.rs | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/vendor/miette/src/named_source.rs b/vendor/miette/src/named_source.rs new file mode 100644 index 0000000..31ad1d1 --- /dev/null +++ b/vendor/miette/src/named_source.rs @@ -0,0 +1,61 @@ +use crate::{MietteError, MietteSpanContents, SourceCode, SpanContents}; + +/// Utility struct for when you have a regular [`SourceCode`] type that doesn't +/// implement `name`. For example [`String`]. Or if you want to override the +/// `name` returned by the `SourceCode`. +pub struct NamedSource { + source: Box<dyn SourceCode + 'static>, + name: String, +} + +impl std::fmt::Debug for NamedSource { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("NamedSource") + .field("name", &self.name) + .field("source", &"<redacted>"); + Ok(()) + } +} + +impl NamedSource { + /// Create a new `NamedSource` using a regular [`SourceCode`] and giving + /// its returned [`SpanContents`] a name. + pub fn new(name: impl AsRef<str>, source: impl SourceCode + Send + Sync + 'static) -> Self { + Self { + source: Box::new(source), + name: name.as_ref().to_string(), + } + } + + /// Gets the name of this `NamedSource`. + pub fn name(&self) -> &str { + &self.name + } + + /// Returns a reference the inner [`SourceCode`] type for this + /// `NamedSource`. + pub fn inner(&self) -> &(dyn SourceCode + 'static) { + &*self.source + } +} + +impl SourceCode for NamedSource { + fn read_span<'a>( + &'a self, + span: &crate::SourceSpan, + context_lines_before: usize, + context_lines_after: usize, + ) -> Result<Box<dyn SpanContents<'a> + 'a>, MietteError> { + let contents = self + .inner() + .read_span(span, context_lines_before, context_lines_after)?; + Ok(Box::new(MietteSpanContents::new_named( + self.name.clone(), + contents.data(), + *contents.span(), + contents.line(), + contents.column(), + contents.line_count(), + ))) + } +} |