use super::{DelimiterPolicy, Transformable};
#[derive(Debug, Copy, Clone)]
pub struct Transformation {
early_delimiter_policy: Option<DelimiterPolicy>,
late_delimiter_policy: Option<DelimiterPolicy>,
tag_to_aol: bool,
from_999: bool,
aol_to_item: bool,
to_999: bool,
bignum_tag_to_edn_integer: bool,
known_structure: Option<KnownStructure>,
bytestring_heuristics: bool,
}
impl Transformation {
pub const fn new() -> Self {
Transformation {
early_delimiter_policy: None,
late_delimiter_policy: None,
tag_to_aol: false,
from_999: false,
aol_to_item: false,
to_999: false,
bignum_tag_to_edn_integer: false,
known_structure: None,
bytestring_heuristics: false,
}
}
pub fn apply_to<'a>(&self, item: &mut impl Transformable<'a>) {
let &Transformation {
early_delimiter_policy,
late_delimiter_policy,
tag_to_aol,
from_999,
aol_to_item,
to_999,
bignum_tag_to_edn_integer,
known_structure,
bytestring_heuristics,
} = self;
if let Some(indent) = early_delimiter_policy {
item.set_delimiters(indent);
}
if bytestring_heuristics {
crate::string::apply_bytestring_heuristincs(item);
}
if from_999 {
item.visit_tag(&mut crate::application::tag999_to_aol);
}
#[allow(clippy::single_match)] match known_structure {
Some(KnownStructure::UnwrappedTag(601)) => {
for item in item.toplevel_items() {
let _ = item.visit_map_elements(&mut crate::application::comment_ccs);
}
}
Some(KnownStructure::CoseHeaderMap) => {
for item in item.toplevel_items() {
let _ = item.visit_map_elements(&mut crate::application::comment_cose_header);
}
}
Some(KnownStructure::UnwrappedTag(_)) | None => {}
}
if tag_to_aol {
item.visit_tag(&mut crate::application::dt_tag_to_aol);
item.visit_tag(&mut crate::application::ip_tag_to_aol);
item.visit_tag(&mut crate::application::comment_lang_tag);
}
if bignum_tag_to_edn_integer {
item.visit_tag(&mut crate::application::bignum_tag_to_edn_integer);
}
if aol_to_item {
item.visit_application_literals(&mut crate::application::dt_aol_to_item);
item.visit_application_literals(&mut crate::application::ip_aol_to_item);
}
if to_999 {
item.visit_application_literals(&mut crate::application::any_aol_to_tag999);
}
if let Some(indent) = late_delimiter_policy {
item.set_delimiters(indent);
}
}
}
impl Transformation {
pub const fn pretty(self) -> Self {
self.indent()
.tag_to_aol()
.bignum_tag_to_edn_integer()
.bytestring_heuristics()
}
pub const fn for_cbor_serialization(self) -> Self {
self.aol_to_item()
}
}
impl Transformation {
pub const fn minify(self) -> Self {
Transformation {
early_delimiter_policy: Some(DelimiterPolicy::DiscardAll),
..self
}
}
pub const fn indent(self) -> Self {
Transformation {
late_delimiter_policy: Some(DelimiterPolicy::indented()),
..self
}
}
pub const fn indent_with_final_newline(self) -> Self {
Transformation {
late_delimiter_policy: Some(DelimiterPolicy::indented_with_final_newline()),
..self
}
}
pub const fn from_999(self) -> Self {
Transformation {
from_999: true,
..self
}
}
pub const fn to_999(self) -> Self {
Transformation {
to_999: true,
..self
}
}
pub const fn tag_to_aol(self) -> Self {
Transformation {
tag_to_aol: true,
..self
}
}
pub const fn bignum_tag_to_edn_integer(self) -> Self {
Transformation {
bignum_tag_to_edn_integer: true,
..self
}
}
pub const fn aol_to_item(self) -> Self {
Transformation {
aol_to_item: true,
..self
}
}
pub fn annotate_unwrapped_tag(self, tag_number: u64) -> Self {
Transformation {
known_structure: Some(KnownStructure::UnwrappedTag(tag_number)),
..self
}
}
pub fn annotate_cose_header_map(self) -> Self {
Transformation {
known_structure: Some(KnownStructure::CoseHeaderMap),
..self
}
}
pub const fn bytestring_heuristics(self) -> Self {
Transformation {
bytestring_heuristics: true,
..self
}
}
}
impl Default for Transformation {
fn default() -> Self {
Self::new()
}
}
#[derive(Copy, Clone, Debug)]
enum KnownStructure {
UnwrappedTag(u64),
CoseHeaderMap,
}