use crate::{
ErrorPrivacyPolicy,
MarkdownFenceClosing,
MarkdownFencePolicy,
};
#[must_use = "JSON decoding options have no effect until used to construct a decoder"]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct JsonDecodeOptions {
trim_whitespace: bool,
strip_utf8_bom: bool,
markdown_fence_policy: MarkdownFencePolicy,
escape_control_chars_in_strings: bool,
max_input_bytes: Option<usize>,
max_normalized_bytes: Option<usize>,
error_privacy_policy: ErrorPrivacyPolicy,
}
impl JsonDecodeOptions {
#[inline]
pub const fn lenient() -> Self {
Self {
trim_whitespace: true,
strip_utf8_bom: true,
markdown_fence_policy: MarkdownFencePolicy::JsonOnly {
closing: MarkdownFenceClosing::Optional,
},
escape_control_chars_in_strings: true,
max_input_bytes: None,
max_normalized_bytes: None,
error_privacy_policy: ErrorPrivacyPolicy::Redacted,
}
}
#[inline]
pub const fn strict() -> Self {
Self {
trim_whitespace: false,
strip_utf8_bom: false,
markdown_fence_policy: MarkdownFencePolicy::Disabled,
escape_control_chars_in_strings: false,
max_input_bytes: None,
max_normalized_bytes: None,
error_privacy_policy: ErrorPrivacyPolicy::Redacted,
}
}
#[inline(always)]
#[must_use]
pub const fn trim_whitespace(&self) -> bool {
self.trim_whitespace
}
#[inline(always)]
pub const fn with_trim_whitespace(mut self, enabled: bool) -> Self {
self.trim_whitespace = enabled;
self
}
#[inline(always)]
#[must_use]
pub const fn strip_utf8_bom(&self) -> bool {
self.strip_utf8_bom
}
#[inline(always)]
pub const fn with_strip_utf8_bom(mut self, enabled: bool) -> Self {
self.strip_utf8_bom = enabled;
self
}
#[inline(always)]
#[must_use = "the configured Markdown fence policy should be inspected"]
pub const fn markdown_fence_policy(&self) -> &MarkdownFencePolicy {
&self.markdown_fence_policy
}
#[inline(always)]
pub const fn with_markdown_fence_policy(
mut self,
markdown_fence_policy: MarkdownFencePolicy,
) -> Self {
self.markdown_fence_policy = markdown_fence_policy;
self
}
#[inline(always)]
#[must_use]
pub const fn escape_control_chars_in_strings(&self) -> bool {
self.escape_control_chars_in_strings
}
#[inline(always)]
pub const fn with_escape_control_chars_in_strings(
mut self,
enabled: bool,
) -> Self {
self.escape_control_chars_in_strings = enabled;
self
}
#[inline(always)]
pub const fn max_input_bytes(&self) -> Option<usize> {
self.max_input_bytes
}
#[inline(always)]
pub const fn with_max_input_bytes(
mut self,
max_input_bytes: Option<usize>,
) -> Self {
self.max_input_bytes = max_input_bytes;
self
}
#[inline(always)]
pub const fn max_normalized_bytes(&self) -> Option<usize> {
self.max_normalized_bytes
}
#[inline(always)]
pub const fn with_max_normalized_bytes(
mut self,
max_normalized_bytes: Option<usize>,
) -> Self {
self.max_normalized_bytes = max_normalized_bytes;
self
}
#[inline(always)]
pub const fn error_privacy_policy(&self) -> ErrorPrivacyPolicy {
self.error_privacy_policy
}
#[inline(always)]
pub const fn with_error_privacy_policy(
mut self,
error_privacy_policy: ErrorPrivacyPolicy,
) -> Self {
self.error_privacy_policy = error_privacy_policy;
self
}
}
impl Default for JsonDecodeOptions {
#[inline(always)]
fn default() -> Self {
Self::lenient()
}
}