databuild/databuild/util.rs

91 lines
2.1 KiB
Rust

use std::backtrace::Backtrace;
use std::time::{SystemTime, UNIX_EPOCH};
pub fn current_timestamp() -> u64 {
let now = SystemTime::now();
let duration_since_epoch = now.duration_since(UNIX_EPOCH).expect("Time went backwards");
duration_since_epoch.as_nanos() as u64
}
fn maybe_backtrace() -> Backtrace {
if std::env::var("RUST_BACKTRACE").is_ok() {
Backtrace::force_capture()
} else {
Backtrace::disabled()
}
}
#[derive(Debug)]
pub struct DatabuildError {
msg: String,
source: Option<Box<dyn std::error::Error + Send + Sync>>,
backtrace: Backtrace,
}
impl DatabuildError {
fn new(msg: impl Into<String>) -> Self {
Self {
msg: msg.into(),
source: None,
backtrace: maybe_backtrace(),
}
}
}
impl From<std::io::Error> for DatabuildError {
fn from(err: std::io::Error) -> Self {
Self {
msg: err.to_string(),
source: Some(Box::new(err)),
backtrace: maybe_backtrace(),
}
}
}
impl From<rusqlite::Error> for DatabuildError {
fn from(err: rusqlite::Error) -> Self {
Self {
msg: err.to_string(),
source: Some(Box::new(err)),
backtrace: maybe_backtrace(),
}
}
}
impl From<prost::EncodeError> for DatabuildError {
fn from(err: prost::EncodeError) -> Self {
Self {
msg: err.to_string(),
source: Some(Box::new(err)),
backtrace: maybe_backtrace(),
}
}
}
impl From<serde_json::Error> for DatabuildError {
fn from(err: serde_json::Error) -> Self {
Self {
msg: err.to_string(),
source: Some(Box::new(err)),
backtrace: maybe_backtrace(),
}
}
}
impl From<String> for DatabuildError {
fn from(value: String) -> Self {
Self::new(value)
}
}
impl From<&str> for DatabuildError {
fn from(value: &str) -> Self {
Self::new(value)
}
}
impl std::fmt::Display for DatabuildError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.msg)
}
}