blob: d8f32601d016e73de8b11829501f9d5410bd6a39 [file] [log] [blame]
// 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 failure::{self, Backtrace, Context, Fail};
use std::fmt::{self, Display};
#[derive(Debug)]
pub struct Error {
inner: Context<ErrorKind>,
}
#[derive(Clone, Eq, PartialEq, Debug, Fail)]
pub enum ErrorKind {
#[fail(display = "error reading /system/meta")]
ReadSystemMeta,
#[fail(display = "error parsing /system/meta merkle")]
ParseSystemMeta,
#[fail(display = "error connecting to PackageResolver")]
ConnectPackageResolver,
#[fail(display = "error creating Directory proxy for the update package")]
CreateUpdatePackageDirectoryProxy,
#[fail(display = "fidl error resolving update package")]
ResolveUpdatePackageFidl,
#[fail(display = "error resolving update package")]
ResolveUpdatePackage,
#[fail(display = "error creating File endpoints for the update package's 'packages' file")]
CreateUpdatePackagePackagesEndpoint,
#[fail(display = "error opening the update package's 'packages' file")]
OpenUpdatePackagePackages,
#[fail(display = "error converting 'packages' handle into an fd")]
CreatePackagesFd,
#[fail(display = "error reading line from 'packages' file")]
ReadPackages,
#[fail(display = "error parsing latest system image merkle: {}", packages_entry)]
ParseLatestSystemImageMerkle { packages_entry: String },
#[fail(
display = "could not find latest system image merkle in update package's 'packages' list"
)]
MissingLatestSystemImageMerkle,
#[fail(display = "error connecting to component Launcher")]
ConnectToLauncher,
#[fail(display = "error launching system_updater component")]
LaunchSystemUpdater,
#[fail(display = "error waiting for system_updater component")]
WaitForSystemUpdater,
#[fail(display = "system_updater component exited with failure")]
SystemUpdaterFailed,
#[fail(
display = "system_updater component exited with success, it should have rebooted the system"
)]
SystemUpdaterFinished,
#[fail(display = "failed to garbage collect pkgfs")]
PkgfsGc,
}
impl Fail for Error {
fn name(&self) -> Option<&str> {
self.inner.name()
}
fn cause(&self) -> Option<&dyn Fail> {
self.inner.cause()
}
fn backtrace(&self) -> Option<&Backtrace> {
self.inner.backtrace()
}
}
impl Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
Display::fmt(&self.inner, f)
}
}
impl From<ErrorKind> for Error {
fn from(kind: ErrorKind) -> Error {
Error { inner: Context::new(kind) }
}
}
impl From<Context<ErrorKind>> for Error {
fn from(inner: Context<ErrorKind>) -> Error {
Error { inner: inner }
}
}
#[cfg(test)]
impl Error {
pub fn kind(&self) -> ErrorKind {
self.inner.get_context().clone()
}
}