// Copyright 2021 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 {crate::errors::FxfsError, fuchsia_zircon::Status};

impl From<FxfsError> for Status {
    fn from(err: FxfsError) -> Status {
        match err {
            FxfsError::AlreadyExists => Status::ALREADY_EXISTS,
            FxfsError::Inconsistent => Status::IO_DATA_INTEGRITY,
            FxfsError::Internal => Status::INTERNAL,
            FxfsError::NotDir => Status::NOT_DIR,
            FxfsError::NotFound => Status::NOT_FOUND,
        }
    }
}

pub(super) fn map_to_status(err: anyhow::Error) -> Status {
    if let Some(status) = err.root_cause().downcast_ref::<Status>() {
        status.clone()
    } else if let Some(fxfs_error) = err.root_cause().downcast_ref::<FxfsError>() {
        fxfs_error.clone().into()
    } else {
        Status::INTERNAL
    }
}
