use std::error::Error;
pub use crate::up_core_api::ucode::UCode;
pub use crate::up_core_api::ustatus::UStatus;
impl UStatus {
pub fn ok() -> Self {
UStatus {
code: UCode::OK.into(),
..Default::default()
}
}
pub fn fail<M: Into<String>>(msg: M) -> Self {
UStatus {
code: UCode::UNKNOWN.into(),
message: Some(msg.into()),
..Default::default()
}
}
pub fn fail_with_code<M: Into<String>>(code: UCode, msg: M) -> Self {
UStatus {
code: code.into(),
message: Some(msg.into()),
..Default::default()
}
}
pub fn is_failed(&self) -> bool {
self.get_code() != UCode::OK
}
pub fn is_success(&self) -> bool {
self.get_code() == UCode::OK
}
pub fn get_message(&self) -> String {
match self.message.as_ref() {
Some(msg) => msg.to_owned(),
None => String::default(),
}
}
pub fn get_code(&self) -> UCode {
self.code.enum_value_or_default()
}
}
impl Error for UStatus {}
#[cfg(test)]
mod tests {
use super::*;
use protobuf::{well_known_types::any::Any, Enum, EnumOrUnknown, Message};
#[test]
fn test_ustatus_fail_with_code() {
let details = vec![Any {
type_url: "type.googleapis.com/google.protobuf.Timestamp".to_string(),
..Default::default()
}];
UCode::VALUES.iter().for_each(|code| {
let mut ustatus = UStatus::fail_with_code(*code, "the message");
ustatus.details = details.clone();
assert!(
ustatus.code.enum_value().is_ok_and(|v| v == *code)
&& ustatus.message.is_some_and(|v| v == "the message")
);
});
}
#[test]
fn test_proto_serialization() {
let ustatus = UStatus {
code: UCode::CANCELLED.into(),
message: Some("the message".to_string()),
details: vec![Any {
type_url: "type.googleapis.com/google.protobuf.Timestamp".to_string(),
..Default::default()
}],
..Default::default()
};
let proto = ustatus
.write_to_bytes()
.expect("failed to serialize to protobuf");
let deserialized_status =
UStatus::parse_from_bytes(proto.as_slice()).expect("failed to deserialize protobuf");
assert_eq!(ustatus, deserialized_status);
}
#[test]
fn test_is_failed() {
assert!(!UStatus {
..Default::default()
}
.is_failed());
UCode::VALUES.iter().for_each(|code| {
let ustatus = UStatus {
code: EnumOrUnknown::from(*code),
..Default::default()
};
assert_eq!(ustatus.is_failed(), *code != UCode::OK);
});
}
#[test]
fn test_is_success() {
assert!(UStatus {
..Default::default()
}
.is_success());
UCode::VALUES.iter().for_each(|code| {
let ustatus = UStatus {
code: EnumOrUnknown::from(*code),
..Default::default()
};
assert_eq!(ustatus.is_success(), *code == UCode::OK);
});
}
}