91 lines
2.1 KiB
Rust
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)
|
|
}
|
|
}
|