use std::sync::Arc;
use std::sync::Once;
use binary_options_tools_core_pre::{
error::CoreResult,
middleware::{MiddlewareContext, WebSocketMiddleware},
reimports::Message,
traits::AppState,
};
use rust_decimal::Decimal;
use std::str::FromStr;
pub mod serialize;
static INIT: Once = Once::new();
pub fn init_crypto_provider() {
INIT.call_once(|| {
rustls::crypto::ring::default_provider()
.install_default()
.ok();
});
}
pub async fn print_handler(msg: Arc<Message>) -> CoreResult<()> {
tracing::debug!(target: "Lightweight", "Received: {msg:?}");
Ok(())
}
pub struct PrintMiddleware;
#[async_trait::async_trait]
impl<S: AppState> WebSocketMiddleware<S> for PrintMiddleware {
async fn on_send(&self, message: &Message, _context: &MiddlewareContext<S>) -> CoreResult<()> {
tracing::debug!(target: "Middleware", "Sending: {message:?}");
Ok(())
}
async fn on_receive(
&self,
message: &Message,
_context: &MiddlewareContext<S>,
) -> CoreResult<()> {
tracing::debug!(target: "Middleware", "Receiving: {message:?}");
Ok(())
}
}
pub fn f64_to_decimal(value: f64) -> Option<Decimal> {
if !value.is_finite() {
return None;
}
let mut buffer = ryu::Buffer::new();
let formatted = buffer.format_finite(value);
Decimal::from_str(formatted).ok()
}
#[cfg(test)]
mod tests {
use super::*;
use rust_decimal::prelude::{FromPrimitive, ToPrimitive};
#[test]
fn test_f64_to_decimal_basic() {
assert_eq!(f64_to_decimal(1.5), Some(Decimal::from_f64(1.5).unwrap()));
assert_eq!(
f64_to_decimal(122.24),
Some(Decimal::from_f64(122.24).unwrap())
);
assert_eq!(f64_to_decimal(0.0), Some(Decimal::from_f64(0.0).unwrap()));
assert_eq!(
f64_to_decimal(-5.75),
Some(Decimal::from_f64(-5.75).unwrap())
);
}
#[test]
fn test_f64_to_decimal_scientific() {
let value = 1.770706e+09;
let result = f64_to_decimal(value).unwrap();
assert_eq!(result, Decimal::from_u32(1770706000).unwrap());
let value2 = 1.23e+05;
let result2 = f64_to_decimal(value2).unwrap();
assert_eq!(result2, Decimal::from_u32(123000).unwrap());
let round_trip = result.to_f64().unwrap();
assert_eq!(round_trip, value);
}
#[test]
fn test_f64_to_decimal_invalid() {
assert_eq!(f64_to_decimal(f64::NAN), None);
assert_eq!(f64_to_decimal(f64::INFINITY), None);
assert_eq!(f64_to_decimal(f64::NEG_INFINITY), None);
}
}