taler-rust

GNU Taler code in Rust. Largely core banking integrations.
Log | Files | Refs | Submodules | README | LICENSE

error.rs (1444B)


      1 /*
      2   This file is part of TALER
      3   Copyright (C) 2025 Taler Systems SA
      4 
      5   TALER is free software; you can redistribute it and/or modify it under the
      6   terms of the GNU Affero General Public License as published by the Free Software
      7   Foundation; either version 3, or (at your option) any later version.
      8 
      9   TALER is distributed in the hope that it will be useful, but WITHOUT ANY
     10   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
     11   A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more details.
     12 
     13   You should have received a copy of the GNU Affero General Public License along with
     14   TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
     15 */
     16 
     17 /// Error wrapper than display an error with its sources
     18 #[derive(Debug)]
     19 pub struct FmtSource<E: std::error::Error>(E);
     20 
     21 fn fmt_with_source(
     22     f: &mut std::fmt::Formatter<'_>,
     23     mut e: &dyn std::error::Error,
     24 ) -> std::fmt::Result {
     25     loop {
     26         write!(f, "{}", &e)?;
     27         if let Some(source) = e.source() {
     28             write!(f, ": ")?;
     29             e = source;
     30         } else {
     31             return Ok(());
     32         }
     33     }
     34 }
     35 
     36 impl<E: std::error::Error> std::fmt::Display for FmtSource<E> {
     37     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
     38         fmt_with_source(f, &self.0)
     39     }
     40 }
     41 
     42 impl<E: std::error::Error> From<E> for FmtSource<E> {
     43     fn from(value: E) -> Self {
     44         Self(value)
     45     }
     46 }