use std::io::{self, Write};
use crate::{TryTypeError, ValueType, array::Array, object::Object};
pub trait TypedValue {
#[must_use]
fn value_type(&self) -> ValueType;
}
pub trait TypedCustomValue {
#[cfg(feature = "custom-types")]
fn is_custom(&self) -> bool {
false
}
}
pub trait ValueAsScalar {
#[must_use]
fn as_null(&self) -> Option<()>;
#[must_use]
fn as_bool(&self) -> Option<bool>;
#[inline]
#[must_use]
fn as_i128(&self) -> Option<i128> {
self.as_i64().map(Into::into)
}
#[must_use]
fn as_i64(&self) -> Option<i64>;
#[inline]
#[must_use]
fn as_i32(&self) -> Option<i32> {
self.as_i64().and_then(|u| u.try_into().ok())
}
#[inline]
#[must_use]
fn as_i16(&self) -> Option<i16> {
self.as_i64().and_then(|u| u.try_into().ok())
}
#[inline]
#[must_use]
fn as_i8(&self) -> Option<i8> {
self.as_i64().and_then(|u| u.try_into().ok())
}
#[inline]
#[must_use]
fn as_u128(&self) -> Option<u128> {
self.as_u64().map(Into::into)
}
#[must_use]
fn as_u64(&self) -> Option<u64>;
#[inline]
#[must_use]
fn as_usize(&self) -> Option<usize> {
self.as_u64().and_then(|u| u.try_into().ok())
}
#[inline]
#[must_use]
fn as_u32(&self) -> Option<u32> {
self.as_u64().and_then(|u| u.try_into().ok())
}
#[inline]
#[must_use]
fn as_u16(&self) -> Option<u16> {
self.as_u64().and_then(|u| u.try_into().ok())
}
#[inline]
#[must_use]
fn as_u8(&self) -> Option<u8> {
self.as_u64().and_then(|u| u.try_into().ok())
}
#[must_use]
fn as_f64(&self) -> Option<f64>;
#[inline]
#[must_use]
fn as_f32(&self) -> Option<f32> {
self.as_f64().and_then(|u| {
if u <= f64::from(f32::MAX) && u >= f64::from(f32::MIN) {
#[allow(clippy::cast_possible_truncation)]
Some(u as f32)
} else {
None
}
})
}
#[must_use]
#[inline]
#[allow(clippy::cast_precision_loss, clippy::option_if_let_else)]
fn cast_f64(&self) -> Option<f64> {
if let Some(f) = self.as_f64() {
Some(f)
} else if let Some(u) = self.as_u128() {
Some(u as f64)
} else {
self.as_i128().map(|i| i as f64)
}
}
#[must_use]
fn as_str(&self) -> Option<&str>;
#[inline]
#[must_use]
fn as_char(&self) -> Option<char> {
self.as_str().and_then(|s| s.chars().next())
}
}
pub trait ValueAsArray {
type Array: Array;
#[must_use]
fn as_array(&self) -> Option<&Self::Array>;
}
pub trait ValueAsObject {
type Object: Object;
#[must_use]
fn as_object(&self) -> Option<&Self::Object>;
}
pub trait ValueAsMutArray {
type Array;
fn as_array_mut(&mut self) -> Option<&mut Self::Array>;
}
pub trait ValueTryAsArrayMut {
type Array: Array;
fn try_as_array_mut(&mut self) -> Result<&mut Self::Array, TryTypeError>;
}
pub trait ValueAsMutObject {
type Object;
fn as_object_mut(&mut self) -> Option<&mut Self::Object>;
}
pub trait ValueTryAsMutObject {
type Object;
fn try_as_object_mut(&mut self) -> Result<&mut Self::Object, TryTypeError>;
}
pub trait ValueIntoString {
type String;
#[must_use]
fn into_string(self) -> Option<Self::String>;
}
pub trait ValueIntoArray {
type Array;
#[must_use]
fn into_array(self) -> Option<Self::Array>;
}
pub trait ValueIntoObject {
type Object;
#[must_use]
fn into_object(self) -> Option<Self::Object>;
}
pub trait Writable {
#[must_use]
fn encode(&self) -> String;
#[must_use]
fn encode_pp(&self) -> String;
fn write<'writer, W>(&self, w: &mut W) -> io::Result<()>
where
W: 'writer + Write;
fn write_pp<'writer, W>(&self, w: &mut W) -> io::Result<()>
where
W: 'writer + Write;
}