pub use neuro_sama_derive as derive;
pub mod game;
pub mod schema;
#[doc(hidden)]
pub use schemars;
#[doc(hidden)]
pub use serde;
#[cfg(not(feature = "strip-trailing-zeroes"))]
fn to_string<T>(value: &T) -> serde_json::Result<String>
where
T: ?Sized + serde::Serialize,
{
serde_json::to_string(value)
}
#[cfg(feature = "strip-trailing-zeroes")]
fn to_string<T>(value: &T) -> serde_json::Result<String>
where
T: ?Sized + serde::Serialize,
{
struct Formatter;
impl serde_json::ser::Formatter for Formatter {
fn write_f32<W>(&mut self, writer: &mut W, value: f32) -> std::io::Result<()>
where
W: ?Sized + std::io::Write,
{
if value.is_finite() && value == value.trunc() {
unsafe {
if value >= 0.0 {
if value <= u32::MAX as f32 {
serde_json::ser::CompactFormatter
.write_u32(writer, value.to_int_unchecked())
} else if value <= u64::MAX as f32 {
serde_json::ser::CompactFormatter
.write_u64(writer, value.to_int_unchecked())
} else if value <= u128::MAX as f32 {
serde_json::ser::CompactFormatter
.write_u128(writer, value.to_int_unchecked())
} else {
serde_json::ser::CompactFormatter.write_f32(writer, value)
}
} else if value >= i32::MAX as f32 {
serde_json::ser::CompactFormatter
.write_i32(writer, value.to_int_unchecked())
} else if value >= i64::MAX as f32 {
serde_json::ser::CompactFormatter
.write_i64(writer, value.to_int_unchecked())
} else if value >= i128::MAX as f32 {
serde_json::ser::CompactFormatter
.write_i128(writer, value.to_int_unchecked())
} else {
serde_json::ser::CompactFormatter.write_f32(writer, value)
}
}
} else {
serde_json::ser::CompactFormatter.write_f32(writer, value)
}
}
fn write_f64<W>(&mut self, writer: &mut W, value: f64) -> std::io::Result<()>
where
W: ?Sized + std::io::Write,
{
if value.is_finite() && value == value.trunc() {
unsafe {
if value >= 0.0 {
if value <= u32::MAX as f64 {
serde_json::ser::CompactFormatter
.write_u32(writer, value.to_int_unchecked())
} else if value <= u64::MAX as f64 {
serde_json::ser::CompactFormatter
.write_u64(writer, value.to_int_unchecked())
} else if value <= u128::MAX as f64 {
serde_json::ser::CompactFormatter
.write_u128(writer, value.to_int_unchecked())
} else {
serde_json::ser::CompactFormatter.write_f64(writer, value)
}
} else if value >= i32::MAX as f64 {
serde_json::ser::CompactFormatter
.write_i32(writer, value.to_int_unchecked())
} else if value >= i64::MAX as f64 {
serde_json::ser::CompactFormatter
.write_i64(writer, value.to_int_unchecked())
} else if value >= i128::MAX as f64 {
serde_json::ser::CompactFormatter
.write_i128(writer, value.to_int_unchecked())
} else {
serde_json::ser::CompactFormatter.write_f64(writer, value)
}
}
} else {
serde_json::ser::CompactFormatter.write_f64(writer, value)
}
}
fn write_number_str<W>(&mut self, writer: &mut W, value: &str) -> std::io::Result<()>
where
W: ?Sized + std::io::Write,
{
serde_json::ser::CompactFormatter.write_number_str(
writer,
if value.contains('.') {
value.trim_end_matches('0').trim_end_matches('.')
} else {
value
},
)
}
}
let mut vec = Vec::with_capacity(128);
let mut ser = serde_json::Serializer::with_formatter(&mut vec, Formatter);
value.serialize(&mut ser)?;
let string = unsafe {
String::from_utf8_unchecked(vec)
};
Ok(string)
}