| // 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() |
| } |
| } |