// Copyright 2019 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 fuchsia_url::pkg_url::PkgUrl;
use fuchsia_zircon as zx;
use std::io;

#[derive(Debug, thiserror::Error)]
pub enum Error {
    #[error("reading /pkgfs/system/meta")]
    ReadSystemMeta(#[source] io::Error),

    #[error("parsing /pkgfs/system/meta merkle")]
    ParseSystemMeta(#[source] fuchsia_hash::ParseHashError),

    #[error("connecting to PackageResolver")]
    ConnectPackageResolver(#[source] anyhow::Error),

    #[error("connecting to Paver")]
    ConnectPaver(#[source] anyhow::Error),

    #[error("system-updater component exited with failure")]
    SystemUpdaterFailed,

    #[error("installation ended unexpectedly")]
    InstallationEndedUnexpectedly,

    #[error("reboot FIDL returned error")]
    RebootFailed(#[source] fidl::Error),

    #[error("update package")]
    UpdatePackage(#[from] UpdatePackage),
}

#[derive(Debug, thiserror::Error)]
pub enum UpdatePackage {
    #[error("creating Directory proxy to resolve the update package")]
    CreateDirectoryProxy(#[source] fidl::Error),

    #[error("fidl error resolving update package")]
    ResolveFidl(#[source] fidl::Error),

    #[error("resolving update package")]
    Resolve(#[source] zx::Status),

    #[error("extracting the 'packages' manifest")]
    ExtractPackagesManifest(#[source] update_package::ParsePackageError),

    #[error("could not find system_image/0 in 'packages' manifest")]
    MissingSystemImage,

    #[error("system_image/0 pkg url was not merkle pinned: {0}")]
    UnPinnedSystemImage(PkgUrl),

    #[error("extracting package hash")]
    Hash(#[source] update_package::HashError),
}
