use super::super::{hints::*, *};
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct SerializationMode {
pub integer: IntegerSerializationMode,
pub unsigned_integer: UnsignedIntegerSerializationMode,
pub float: FloatSerializationMode,
pub blob: BlobSerializationMode,
pub map: MapSerializationMode,
}
impl SerializationMode {
pub fn for_format(format: &Format) -> Option<Self> {
match format {
Format::YAML => Some(Self::for_yaml()),
Format::JSON => Some(Self::for_json()),
Format::XJSON => Some(Self::for_xjson()),
_ => None,
}
}
pub fn for_yaml() -> Self {
Self { blob: BlobSerializationMode::StringifyBase64(None), ..Default::default() }
}
pub fn for_json() -> Self {
Self {
blob: BlobSerializationMode::StringifyBase64(None),
map: MapSerializationMode::SerializeKeysIfNonText,
..Default::default()
}
}
pub fn for_xjson() -> Self {
let hints = Hints::xjson();
Self {
integer: IntegerSerializationMode::Stringify(Some(hints.integer)),
unsigned_integer: UnsignedIntegerSerializationMode::Stringify(Some(hints.unsigned_integer)),
blob: BlobSerializationMode::StringifyBase64(Some(hints.bytes)),
map: MapSerializationMode::AsSeqIfNonTextKey(Some(hints.map)),
..Default::default()
}
}
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub enum IntegerSerializationMode {
#[default]
AsI64,
AsU64IfNonNegative,
AsF64,
Stringify(Option<String>),
}
impl IntegerSerializationMode {
pub fn might_be_float(&self) -> bool {
matches!(self, IntegerSerializationMode::AsF64)
}
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub enum UnsignedIntegerSerializationMode {
#[default]
AsU64,
AsI64,
AsF64,
Stringify(Option<String>),
}
impl UnsignedIntegerSerializationMode {
pub fn might_be_integer(&self) -> bool {
matches!(self, UnsignedIntegerSerializationMode::AsI64)
}
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub enum FloatSerializationMode {
#[default]
AsF64,
AsI64,
AsI64IfWhole,
Stringify(Option<String>),
}
impl FloatSerializationMode {
pub fn might_be_integer(&self) -> bool {
matches!(self, FloatSerializationMode::AsI64 | FloatSerializationMode::AsI64IfWhole)
}
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub enum BlobSerializationMode {
#[default]
AsBytes,
StringifyBase64(Option<String>),
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub enum MapSerializationMode {
#[default]
AsMap,
AsSeq(Option<String>),
AsSeqIfNonTextKey(Option<String>),
SerializeKeys,
SerializeKeysIfNonText,
}