blob: c5aeebd69162b4f531902c6527a1532badff644e [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 {
crate::model::*,
failure::{Error, Fail},
};
/// Errors produced by `Model`.
#[derive(Debug, Fail)]
pub enum ModelError {
#[fail(display = "component instance not found with moniker {}", moniker)]
InstanceNotFound { moniker: AbsoluteMoniker },
#[fail(display = "component instance with moniker {} already exists", moniker)]
InstanceAlreadyExists { moniker: AbsoluteMoniker },
#[fail(display = "component collection not found with name {}", name)]
CollectionNotFound { name: String },
#[fail(display = "{} is not supported", feature)]
Unsupported { feature: String },
#[fail(display = "component declaration invalid")]
ComponentInvalid,
#[fail(display = "Hub operation failed")]
HubError {
#[fail(cause)]
err: HubError,
},
#[fail(display = "component manifest invalid")]
ManifestInvalid {
url: String,
#[fail(cause)]
err: Error,
},
#[fail(display = "namespace creation failed: {}", err)]
NamespaceCreationFailed {
#[fail(cause)]
err: Error,
},
#[fail(display = "resolver error")]
ResolverError {
#[fail(cause)]
err: ResolverError,
},
#[fail(display = "runner error")]
RunnerError {
#[fail(cause)]
err: RunnerError,
},
#[fail(display = "ambient error")]
AmbientError {
#[fail(cause)]
err: AmbientError,
},
#[fail(display = "capability discovery error")]
CapabilityDiscoveryError {
#[fail(cause)]
err: Error,
},
#[fail(display = "add entry error")]
AddEntryError { moniker: AbsoluteMoniker, entry_name: String },
}
impl ModelError {
pub fn instance_not_found(moniker: AbsoluteMoniker) -> ModelError {
ModelError::InstanceNotFound { moniker }
}
pub fn instance_already_exists(moniker: AbsoluteMoniker) -> ModelError {
ModelError::InstanceAlreadyExists { moniker }
}
pub fn collection_not_found(name: impl Into<String>) -> ModelError {
ModelError::CollectionNotFound { name: name.into() }
}
pub fn unsupported(feature: impl Into<String>) -> ModelError {
ModelError::Unsupported { feature: feature.into() }
}
pub fn namespace_creation_failed(err: impl Into<Error>) -> ModelError {
ModelError::NamespaceCreationFailed { err: err.into() }
}
pub fn manifest_invalid(url: impl Into<String>, err: impl Into<Error>) -> ModelError {
ModelError::ManifestInvalid { url: url.into(), err: err.into() }
}
pub fn capability_discovery_error(err: impl Into<Error>) -> ModelError {
ModelError::CapabilityDiscoveryError { err: err.into() }
}
pub fn add_entry_error(moniker: AbsoluteMoniker, entry_name: impl Into<String>) -> ModelError {
ModelError::AddEntryError { moniker, entry_name: entry_name.into() }
}
}
impl From<HubError> for ModelError {
fn from(err: HubError) -> Self {
ModelError::HubError { err }
}
}
impl From<ResolverError> for ModelError {
fn from(err: ResolverError) -> Self {
ModelError::ResolverError { err }
}
}
impl From<RunnerError> for ModelError {
fn from(err: RunnerError) -> Self {
ModelError::RunnerError { err }
}
}
impl From<AmbientError> for ModelError {
fn from(err: AmbientError) -> Self {
ModelError::AmbientError { err }
}
}