use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::fmt;
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Hash,
Serialize,
Deserialize,
PartialOrd,
Ord,
rkyv::Archive,
rkyv::Serialize,
rkyv::Deserialize,
)]
pub struct MarketId(pub u64);
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Hash,
Serialize,
Deserialize,
PartialOrd,
Ord,
Default,
rkyv::Archive,
rkyv::Serialize,
rkyv::Deserialize,
)]
pub struct RunnerId(pub u32);
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Hash,
Serialize,
Deserialize,
PartialOrd,
Ord,
rkyv::Archive,
rkyv::Serialize,
rkyv::Deserialize,
)]
pub struct AccountId(pub u64);
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Hash,
Serialize,
Deserialize,
PartialOrd,
Ord,
rkyv::Archive,
rkyv::Serialize,
rkyv::Deserialize,
)]
pub struct OrderId(pub u64);
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Hash,
Serialize,
Deserialize,
PartialOrd,
Ord,
rkyv::Archive,
rkyv::Serialize,
rkyv::Deserialize,
)]
pub struct TradeId(pub u64);
#[derive(
Debug,
Clone,
PartialEq,
Eq,
Hash,
PartialOrd,
Ord,
rkyv::Archive,
rkyv::Serialize,
rkyv::Deserialize,
)]
pub struct CorrelationId(String);
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct CorrelationIdError {
len: usize,
}
impl CorrelationIdError {
pub fn len(self) -> usize {
self.len
}
pub fn is_empty(self) -> bool {
self.len == 0
}
}
impl fmt::Display for CorrelationIdError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if self.len == 0 {
write!(f, "correlation_id cannot be empty")
} else {
write!(
f,
"correlation_id length must be <= {} bytes, got {}",
CorrelationId::MAX_LEN,
self.len
)
}
}
}
impl std::error::Error for CorrelationIdError {}
impl CorrelationId {
pub const MAX_LEN: usize = 36;
pub fn try_new(value: impl Into<String>) -> Result<Self, CorrelationIdError> {
let value = value.into();
let len = value.len();
if len == 0 || len > Self::MAX_LEN {
return Err(CorrelationIdError { len });
}
Ok(Self(value))
}
pub fn as_str(&self) -> &str {
&self.0
}
pub fn into_inner(self) -> String {
self.0
}
}
impl Default for CorrelationId {
fn default() -> Self {
Self::from(0_u64)
}
}
impl fmt::Display for CorrelationId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
impl From<u64> for CorrelationId {
fn from(value: u64) -> Self {
Self(value.to_string())
}
}
impl TryFrom<&str> for CorrelationId {
type Error = CorrelationIdError;
fn try_from(value: &str) -> Result<Self, Self::Error> {
Self::try_new(value.to_string())
}
}
impl TryFrom<String> for CorrelationId {
type Error = CorrelationIdError;
fn try_from(value: String) -> Result<Self, Self::Error> {
Self::try_new(value)
}
}
impl Serialize for CorrelationId {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for CorrelationId {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let value = String::deserialize(deserializer)?;
Self::try_new(value).map_err(serde::de::Error::custom)
}
}
#[derive(
Debug,
Clone,
PartialEq,
Eq,
Hash,
PartialOrd,
Ord,
rkyv::Archive,
rkyv::Serialize,
rkyv::Deserialize,
)]
pub struct IdempotencyKey(String);
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct IdempotencyKeyError {
len: usize,
}
impl IdempotencyKeyError {
pub fn len(self) -> usize {
self.len
}
pub fn is_empty(self) -> bool {
self.len == 0
}
}
impl fmt::Display for IdempotencyKeyError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if self.len == 0 {
write!(f, "idempotency_key cannot be empty")
} else {
write!(
f,
"idempotency_key length must be <= {} bytes, got {}",
IdempotencyKey::MAX_LEN,
self.len
)
}
}
}
impl std::error::Error for IdempotencyKeyError {}
impl IdempotencyKey {
pub const MAX_LEN: usize = 36;
pub fn try_new(value: impl Into<String>) -> Result<Self, IdempotencyKeyError> {
let value = value.into();
let len = value.len();
if len == 0 || len > Self::MAX_LEN {
return Err(IdempotencyKeyError { len });
}
Ok(Self(value))
}
pub fn as_str(&self) -> &str {
&self.0
}
pub fn into_inner(self) -> String {
self.0
}
}
impl fmt::Display for IdempotencyKey {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
impl From<u64> for IdempotencyKey {
fn from(value: u64) -> Self {
Self(value.to_string())
}
}
impl TryFrom<&str> for IdempotencyKey {
type Error = IdempotencyKeyError;
fn try_from(value: &str) -> Result<Self, Self::Error> {
Self::try_new(value.to_string())
}
}
impl TryFrom<String> for IdempotencyKey {
type Error = IdempotencyKeyError;
fn try_from(value: String) -> Result<Self, Self::Error> {
Self::try_new(value)
}
}
impl Serialize for IdempotencyKey {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(self.as_str())
}
}
impl<'de> Deserialize<'de> for IdempotencyKey {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let value = String::deserialize(deserializer)?;
Self::try_new(value).map_err(serde::de::Error::custom)
}
}
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
Hash,
Serialize,
Deserialize,
PartialOrd,
Ord,
rkyv::Archive,
rkyv::Serialize,
rkyv::Deserialize,
)]
pub struct ClientOrderId(pub u64);