blob: f19a231886c67794dcaecb13052be599cb1c2261 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use anyhow::Context as _;
use fidl_fuchsia_net_filter_deprecated as filter;
pub trait FidlReturn {
type Item;
fn transform_result(self) -> Result<Self::Item, anyhow::Error>;
}
macro_rules! impl_trait {
($error:ident) => {
pub struct $error(pub filter::$error);
impl std::fmt::Debug for $error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Debug::fmt(&self.0, f)
}
}
impl std::fmt::Display for $error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Debug::fmt(self, f)
}
}
impl std::error::Error for $error {}
impl<T> FidlReturn for Result<Result<T, filter::$error>, fidl::Error> {
type Item = T;
fn transform_result(self) -> Result<Self::Item, anyhow::Error> {
Ok(self.context("FIDL error")?.map_err($error).context("Filter error")?)
}
}
};
}
impl_trait!(EnableDisableInterfaceError);
impl_trait!(FilterUpdateRulesError);
impl_trait!(FilterUpdateNatRulesError);
impl_trait!(FilterUpdateRdrRulesError);