// Copyright (c) 2021 Teddy Wing // // This file is part of Reflectub. // // Reflectub is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Reflectub is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Reflectub. If not, see . use std::fmt; /// Wraps a list of errors. #[derive(Debug, thiserror::Error)] pub struct MultiError { errors: Vec, } impl fmt::Display for MultiError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!( f, "{}", self.errors .iter() .map(|e| format!("{:#}", e)) .collect::>() .join("\n"), ) } } impl From for MultiError { fn from(error: anyhow::Error) -> Self { MultiError { errors: vec![error] } } } impl From> for MultiError { fn from(errors: Vec) -> Self { MultiError { errors: errors } } } impl IntoIterator for MultiError { type Item = anyhow::Error; type IntoIter = std::vec::IntoIter; fn into_iter(self) -> Self::IntoIter { self.errors.into_iter() } }