/// Used to get an object that knows how to format this object. pub trait AsFormat { type Format<'a>: ruff_formatter::Format where Self: 'a; /// Returns an object that is able to format this object. fn format(&self) -> Self::Format<'_>; } /// Implement [`AsFormat`] for references to types that implement [`AsFormat`]. impl AsFormat for &T where T: AsFormat, { type Format<'a> = T::Format<'a> where Self: 'a; fn format(&self) -> Self::Format<'_> { AsFormat::format(&**self) } } /// Used to convert this object into an object that can be formatted. /// /// The difference to [`AsFormat`] is that this trait takes ownership of `self`. pub trait IntoFormat { type Format: ruff_formatter::Format; fn into_format(self) -> Self::Format; } /// Implement [`IntoFormat`] for [`Option`] when `T` implements [`IntoFormat`] /// /// Allows to call format on optional AST fields without having to unwrap the /// field first. impl IntoFormat for Option where T: IntoFormat, { type Format = Option; fn into_format(self) -> Self::Format { self.map(IntoFormat::into_format) } } /// Implement [`IntoFormat`] for references to types that implement [`AsFormat`]. impl<'a, T, C> IntoFormat for &'a T where T: AsFormat, { type Format = T::Format<'a>; fn into_format(self) -> Self::Format { AsFormat::format(self) } } /// Formatting specific [`Iterator`] extensions pub trait FormattedIterExt { /// Converts every item to an object that knows how to format it. fn formatted(self) -> FormattedIter where Self: Iterator + Sized, Self::Item: IntoFormat, { FormattedIter { inner: self, options: std::marker::PhantomData, } } } impl FormattedIterExt for I where I: std::iter::Iterator {} pub struct FormattedIter where Iter: Iterator, { inner: Iter, options: std::marker::PhantomData, } impl std::iter::Iterator for FormattedIter where Iter: Iterator, Item: IntoFormat, { type Item = Item::Format; fn next(&mut self) -> Option { Some(self.inner.next()?.into_format()) } } impl std::iter::FusedIterator for FormattedIter where Iter: std::iter::FusedIterator, Item: IntoFormat, { } impl std::iter::ExactSizeIterator for FormattedIter where Iter: Iterator + std::iter::ExactSizeIterator, Item: IntoFormat, { }