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, 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", &""); Ok(()) } } impl NamedSource { /// Create a new `NamedSource` using a regular [`SourceCode`] and giving /// its returned [`SpanContents`] a name. pub fn new(name: impl AsRef, 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 + '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(), ))) } }