#![deny(
rustdoc::broken_intra_doc_links,
rustdoc::private_intra_doc_links,
unused_qualifications
)]
use std::env::var as env_var;
use std::ffi::OsStr;
use std::sync::atomic::{AtomicU64, Ordering};
use std::time::{SystemTime, UNIX_EPOCH};
pub mod error;
pub(crate) mod util;
pub mod v2;
fn clock() -> u64 {
let now = SystemTime::now().duration_since(UNIX_EPOCH).unwrap();
now.as_secs() * 1000 + now.subsec_millis() as u64
}
#[derive(Debug)]
pub struct Credentials {
pub(crate) access_key: String,
pub(crate) secret_key: String,
nonce: AtomicU64,
}
impl Credentials {
pub fn new(access_key: String, secret_key: String) -> Self {
Self {
access_key,
secret_key,
nonce: AtomicU64::new(clock() - 1),
}
}
pub fn from_env(access_var: impl AsRef<OsStr>, secret_var: impl AsRef<OsStr>) -> Self {
Self {
access_key: env_var(access_var).unwrap_or_default(),
secret_key: env_var(secret_var).unwrap_or_default(),
nonce: AtomicU64::new(clock() - 1),
}
}
pub(crate) fn nonce(&self) -> u64 {
self.nonce
.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |t| {
Some((t + 1).max(clock()))
})
.unwrap()
}
}
pub mod common {
use chrono::{DateTime as ChronoDateTime, Utc};
use serde::{Deserialize, Serialize};
pub type Symbol = String;
pub type DateTime = ChronoDateTime<Utc>;
#[derive(Serialize, Copy, Clone, Eq, PartialEq, Debug)]
#[serde(rename_all = "lowercase")]
pub enum OrderBy {
Asc,
Desc,
}
#[derive(Serialize, Debug)]
pub struct PageParams {
pub page: u64,
pub limit: u64,
}
impl Default for PageParams {
fn default() -> Self {
Self { page: 1, limit: 50 }
}
}
#[derive(Serialize, Deserialize, Copy, Clone, Eq, PartialEq, Debug)]
#[serde(rename_all = "lowercase")]
pub enum OrderSide {
Sell,
Buy,
Unknown,
}
impl OrderSide {
pub fn is_unknown(&self) -> bool {
self == &Self::Unknown
}
}
impl Default for OrderSide {
fn default() -> Self {
Self::Unknown
}
}
#[derive(Deserialize, Copy, Clone, Eq, PartialEq, Debug)]
#[serde(rename_all = "lowercase")]
pub enum TradeSide {
Ask,
Bid,
Unknown,
}
impl TradeSide {
pub fn is_unknown(&self) -> bool {
self == &Self::Unknown
}
}
impl Default for TradeSide {
fn default() -> Self {
Self::Unknown
}
}
}