diff options
Diffstat (limited to 'third_party/rust/glean-core/src/upload/result.rs')
-rw-r--r-- | third_party/rust/glean-core/src/upload/result.rs | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/third_party/rust/glean-core/src/upload/result.rs b/third_party/rust/glean-core/src/upload/result.rs new file mode 100644 index 0000000000..3097af9d64 --- /dev/null +++ b/third_party/rust/glean-core/src/upload/result.rs @@ -0,0 +1,98 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at https://mozilla.org/MPL/2.0/. + +/// The result of an attempted ping upload. +#[derive(Debug)] +pub enum UploadResult { + /// A recoverable failure. + /// + /// During upload something went wrong, + /// e.g. the network connection failed. + /// The upload should be retried at a later time. + RecoverableFailure { + #[doc(hidden)] + /// Unused field. Required because UniFFI can't handle variants without fields. + unused: i8, + }, + + /// An unrecoverable upload failure. + /// + /// A possible cause might be a malformed URL. + UnrecoverableFailure { + #[doc(hidden)] + /// Unused field. Required because UniFFI can't handle variants without fields. + unused: i8, + }, + + /// A HTTP response code. + /// + /// This can still indicate an error, depending on the status code. + HttpStatus { + /// The HTTP status code + code: i32, + }, + + /// Signal that this uploader is done with work + /// and won't accept new work. + Done { + #[doc(hidden)] + /// Unused field. Required because UniFFI can't handle variants without fields. + unused: i8, + }, +} + +impl UploadResult { + /// Gets the label to be used in recording error counts for upload. + /// + /// Returns `None` if the upload finished succesfully. + /// Failures are recorded in the `ping_upload_failure` metric. + pub fn get_label(&self) -> Option<&str> { + match self { + UploadResult::HttpStatus { code: 200..=299 } => None, + UploadResult::HttpStatus { code: 400..=499 } => Some("status_code_4xx"), + UploadResult::HttpStatus { code: 500..=599 } => Some("status_code_5xx"), + UploadResult::HttpStatus { .. } => Some("status_code_unknown"), + UploadResult::UnrecoverableFailure { .. } => Some("unrecoverable"), + UploadResult::RecoverableFailure { .. } => Some("recoverable"), + UploadResult::Done { .. } => None, + } + } + + /// A recoverable failure. + /// + /// During upload something went wrong, + /// e.g. the network connection failed. + /// The upload should be retried at a later time. + pub fn recoverable_failure() -> Self { + Self::RecoverableFailure { unused: 0 } + } + + /// An unrecoverable upload failure. + /// + /// A possible cause might be a malformed URL. + pub fn unrecoverable_failure() -> Self { + Self::UnrecoverableFailure { unused: 0 } + } + + /// A HTTP response code. + /// + /// This can still indicate an error, depending on the status code. + pub fn http_status(code: i32) -> Self { + Self::HttpStatus { code } + } + + /// This uploader is done. + pub fn done() -> Self { + Self::Done { unused: 0 } + } +} + +/// Communication back whether the uploader loop should continue. +#[derive(Debug)] +pub enum UploadTaskAction { + /// Instruct the caller to continue with work. + Next, + /// Instruct the caller to end work. + End, +} |