You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

34 lines
828 B

  1. use std::fmt::Display;
  2. pub trait LogErrorResult<T, E> {
  3. fn log_err(self) -> Result<T, E>;
  4. }
  5. impl<T, E: Display> LogErrorResult<T, E> for Result<T, E> {
  6. fn log_err(self) -> Result<T, E> {
  7. self.map_err(|err| {
  8. error!("{}", err.to_string());
  9. err
  10. })
  11. }
  12. }
  13. trait ResultOps<T, E> {
  14. fn tap<U, F: FnOnce(T) -> U>(self, op: F) -> Result<T, E>;
  15. fn tap_err<F, O: FnOnce(E) -> F>(self, op: O) -> Result<T, E>;
  16. }
  17. impl<T: Clone, E: Clone> ResultOps<T, E> for Result<T, E> {
  18. fn tap<U, F: FnOnce(T) -> U>(self, op: F) -> Result<T, E> {
  19. self.map(|x| {
  20. op(x.clone());
  21. x
  22. })
  23. }
  24. fn tap_err<F, O: FnOnce(E) -> F>(self, op: O) -> Result<T, E> {
  25. self.map_err(|err| {
  26. op(err.clone());
  27. err
  28. })
  29. }
  30. }