1use crate::logs::error::LogsError;
6use fidl::prelude::*;
7use fidl_fuchsia_diagnostics::BatchIteratorControlHandle;
8use log::warn;
9use thiserror::Error;
10use zx_status::Status as ZxStatus;
11
12#[derive(Debug, Error)]
13pub enum Error {
14 #[error(transparent)]
15 Logs(#[from] LogsError),
16
17 #[error("Failed to serve outgoing dir: {0}")]
18 ServeOutgoing(#[source] anyhow::Error),
19
20 #[error(transparent)]
21 Inspect(#[from] fuchsia_inspect::Error),
22
23 #[error(
24 "Encountered a diagnostics data repository node with more than one artifact container. {0:?}"
25 )]
26 MultipleArtifactContainers(Vec<String>),
27
28 #[error(transparent)]
29 Hierarchy(#[from] diagnostics_hierarchy::Error),
30
31 #[error(transparent)]
32 Selectors(#[from] anyhow::Error),
33}
34
35#[derive(Debug, Error)]
36pub enum AccessorError {
37 #[error("data_type must be set")]
38 MissingDataType,
39
40 #[error("client_selector_configuration must be set")]
41 MissingSelectors,
42
43 #[error("no selectors were provided")]
44 EmptySelectors,
45
46 #[error("requested selectors are unsupported: {}", .0)]
47 InvalidSelectors(&'static str),
48
49 #[error("couldn't parse/validate the provided selectors: {}", .0)]
50 ParseSelectors(#[from] selectors::Error),
51
52 #[error("only selectors of type `component:root` are supported for logs at the moment")]
53 InvalidLogSelector,
54
55 #[error("format must be set")]
56 MissingFormat,
57
58 #[error("only JSON supported right now")]
59 UnsupportedFormat,
60
61 #[error("stream_mode must be set")]
62 MissingMode,
63
64 #[error("only snapshot supported right now")]
65 UnsupportedMode,
66
67 #[error("IPC failure")]
68 Ipc {
69 #[from]
70 source: fidl::Error,
71 },
72
73 #[error("Unable to create a VMO -- extremely unusual!")]
74 VmoCreate(#[source] ZxStatus),
75
76 #[error("Unable to write to VMO -- we may be OOMing")]
77 VmoWrite(#[source] ZxStatus),
78
79 #[error("Unable to get VMO size -- extremely unusual")]
80 VmoSize(#[source] ZxStatus),
81
82 #[error("JSON serialization failure: {0}")]
83 Serialization(#[from] serde_json::Error),
84
85 #[error("CBOR serialization failure: {0}")]
86 CborSerialization(#[source] anyhow::Error),
87
88 #[error("batch timeout was set on StreamParameter and on PerformanceConfiguration")]
89 DuplicateBatchTimeout,
90
91 #[error("IO error: {0}")]
92 Io(#[from] std::io::Error),
93}
94
95impl AccessorError {
96 pub fn close(self, control: BatchIteratorControlHandle) {
97 warn!(error:% = self; "Closing BatchIterator.");
98 let epitaph = match self {
99 AccessorError::DuplicateBatchTimeout
100 | AccessorError::MissingDataType
101 | AccessorError::EmptySelectors
102 | AccessorError::MissingSelectors
103 | AccessorError::InvalidSelectors(_)
104 | AccessorError::InvalidLogSelector
105 | AccessorError::ParseSelectors(_) => ZxStatus::INVALID_ARGS,
106 AccessorError::VmoCreate(status)
107 | AccessorError::VmoWrite(status)
108 | AccessorError::VmoSize(status) => status,
109 AccessorError::MissingFormat | AccessorError::MissingMode => ZxStatus::INVALID_ARGS,
110 AccessorError::UnsupportedFormat | AccessorError::UnsupportedMode => {
111 ZxStatus::WRONG_TYPE
112 }
113 AccessorError::Serialization { .. } => ZxStatus::BAD_STATE,
114 AccessorError::CborSerialization { .. } => ZxStatus::BAD_STATE,
115 AccessorError::Ipc { .. } | AccessorError::Io(_) => ZxStatus::IO,
116 };
117 control.shutdown_with_epitaph(epitaph);
118 }
119}