diff --git a/crates/uplc/src/pretty.rs b/crates/uplc/src/pretty.rs index c34f3928..1e78d3bc 100644 --- a/crates/uplc/src/pretty.rs +++ b/crates/uplc/src/pretty.rs @@ -1,12 +1,10 @@ use crate::{ ast::{Constant, Program, Term, Type}, flat::Binder, - plutus_data_to_bytes, }; -use pallas_codec::utils::KeyValuePairs; -use pallas_primitives::babbage::{PlutusData, Constr}; +use pallas_primitives::babbage::{Constr, PlutusData}; use pretty::RcDoc; -use std::{ascii::escape_default, io::Read}; +use std::ascii::escape_default; impl<'a, T> Program where @@ -255,14 +253,14 @@ impl Constant { Constant::Data(data) => RcDoc::text("(") .append(Self::to_doc_list_plutus_data(&data)) - .append(RcDoc::text(")")) + .append(RcDoc::text(")")), } } // This feels a little awkward here; not sure if it should be upstreamed to pallas fn to_doc_list_plutus_data(data: &PlutusData) -> RcDoc<()> { match data { - PlutusData::Constr(Constr{ tag, fields, ..}) => RcDoc::text("Constr") + PlutusData::Constr(Constr { tag, fields, .. }) => RcDoc::text("Constr") .append(RcDoc::space()) .append(RcDoc::as_string(tag)) .append(RcDoc::space()) @@ -276,22 +274,21 @@ impl Constant { .append(RcDoc::space()) .append(RcDoc::text("[")) .append(RcDoc::intersperse( - kvp.iter().map(|(key, value)| RcDoc::text("(") - .append(Self::to_doc_list_plutus_data(key)) - .append(RcDoc::text(", ")) - .append(Self::to_doc_list_plutus_data(value)) - .append(RcDoc::text(")")), - ), + kvp.iter().map(|(key, value)| { + RcDoc::text("(") + .append(Self::to_doc_list_plutus_data(key)) + .append(RcDoc::text(", ")) + .append(Self::to_doc_list_plutus_data(value)) + .append(RcDoc::text(")")) + }), RcDoc::text(", "), )) .append(RcDoc::text("]")), - PlutusData::BigInt(bi) => RcDoc::text("I") - .append(RcDoc::space()) - .append(match bi { - pallas_primitives::babbage::BigInt::Int(v) => RcDoc::text(v.to_string()), - pallas_primitives::babbage::BigInt::BigUInt(v) => RcDoc::text(v.to_string()), - pallas_primitives::babbage::BigInt::BigNInt(v) => RcDoc::text(v.to_string()), - }), + PlutusData::BigInt(bi) => RcDoc::text("I").append(RcDoc::space()).append(match bi { + pallas_primitives::babbage::BigInt::Int(v) => RcDoc::text(v.to_string()), + pallas_primitives::babbage::BigInt::BigUInt(v) => RcDoc::text(v.to_string()), + pallas_primitives::babbage::BigInt::BigNInt(v) => RcDoc::text(v.to_string()), + }), PlutusData::BoundedBytes(bs) => RcDoc::text("B") .append(RcDoc::space()) .append(RcDoc::text("#")) diff --git a/crates/uplc/tests/pretty_tests.rs b/crates/uplc/tests/pretty_tests.rs index cde45713..3a53d386 100644 --- a/crates/uplc/tests/pretty_tests.rs +++ b/crates/uplc/tests/pretty_tests.rs @@ -1,36 +1,59 @@ -use num_bigint::{ToBigInt}; +use num_bigint::ToBigInt; use uplc::{ - ast::{DeBruijn, Constant, Type, Term}, PlutusData, Constr, + ast::{Constant, DeBruijn, Term, Type}, + Constr, PlutusData, }; // Examples sourced from https://github.com/input-output-hk/plutus/issues/4751#issuecomment-1538377273 #[test] fn constant_list_integer() { - let term = Term::::Constant(Constant::ProtoList(Type::Integer.into(), vec![ - Constant::Integer(0.to_bigint().unwrap()), - Constant::Integer(1.to_bigint().unwrap()), - Constant::Integer(2.to_bigint().unwrap()), - ]).into()); + let term = Term::::Constant( + Constant::ProtoList( + Type::Integer.into(), + vec![ + Constant::Integer(0.to_bigint().unwrap()), + Constant::Integer(1.to_bigint().unwrap()), + Constant::Integer(2.to_bigint().unwrap()), + ], + ) + .into(), + ); assert_eq!(term.to_pretty(), "(con (list integer) [0, 1, 2])"); } #[test] fn constant_pair_bool_bytestring() { - let term = Term::::Constant(Constant::ProtoPair( - Type::Bool.into(), Type::ByteString.into(), - Constant::Bool(true).into(), Constant::ByteString(vec![0x01, 0x23, 0x45]).into(), - ).into()); - assert_eq!(term.to_pretty(), "(con (pair bool bytestring) (True, #012345))"); + let term = Term::::Constant( + Constant::ProtoPair( + Type::Bool.into(), + Type::ByteString.into(), + Constant::Bool(true).into(), + Constant::ByteString(vec![0x01, 0x23, 0x45]).into(), + ) + .into(), + ); + assert_eq!( + term.to_pretty(), + "(con (pair bool bytestring) (True, #012345))" + ); } #[test] fn constant_pair_unit_string() { - let term = Term::::Constant(Constant::ProtoPair( - Type::Unit.into(), Type::String.into(), - Constant::Unit.into(), Constant::String("hello universe".into()).into(), - ).into()); - assert_eq!(term.to_pretty(), "(con (pair unit string) ((), \"hello universe\"))") + let term = Term::::Constant( + Constant::ProtoPair( + Type::Unit.into(), + Type::String.into(), + Constant::Unit.into(), + Constant::String("hello universe".into()).into(), + ) + .into(), + ); + assert_eq!( + term.to_pretty(), + "(con (pair unit string) ((), \"hello universe\"))" + ) } #[test] @@ -38,40 +61,62 @@ fn constant_deeply_nested_list() { let t0 = Type::Integer; let t1 = Type::List(t0.clone().into()); let t2 = Type::List(t1.clone().into()); - let term = Term::::Constant(Constant::ProtoList(t2, vec![ - Constant::ProtoList(t1.clone(), vec![ - Constant::ProtoList(t0.clone(), vec![ - Constant::Integer(-1.to_bigint().unwrap()), - ]), - Constant::ProtoList(t0.clone(), vec![]) - ]), - Constant::ProtoList(t1.clone(), vec![ - Constant::ProtoList(t0.clone(), vec![]), - Constant::ProtoList(t0.clone(), vec![ - Constant::Integer(2.to_bigint().unwrap()), - Constant::Integer(3.to_bigint().unwrap()) - ]), - ]) - ]).into()); - assert_eq!(term.to_pretty(), "(con (list (list (list integer))) [[[-1], []], [[], [2, 3]]])"); + let term = Term::::Constant( + Constant::ProtoList( + t2, + vec![ + Constant::ProtoList( + t1.clone(), + vec![ + Constant::ProtoList( + t0.clone(), + vec![Constant::Integer(-1.to_bigint().unwrap())], + ), + Constant::ProtoList(t0.clone(), vec![]), + ], + ), + Constant::ProtoList( + t1.clone(), + vec![ + Constant::ProtoList(t0.clone(), vec![]), + Constant::ProtoList( + t0.clone(), + vec![ + Constant::Integer(2.to_bigint().unwrap()), + Constant::Integer(3.to_bigint().unwrap()), + ], + ), + ], + ), + ], + ) + .into(), + ); + assert_eq!( + term.to_pretty(), + "(con (list (list (list integer))) [[[-1], []], [[], [2, 3]]])" + ); } #[test] fn constant_data_constr() { - let term = Term::::Constant(Constant::Data( - PlutusData::Constr(Constr:: { + let term = Term::::Constant( + Constant::Data(PlutusData::Constr(Constr:: { tag: 1, any_constructor: None, - fields: vec![PlutusData::BigInt(pallas_primitives::alonzo::BigInt::Int(2.into()))] - }) - ).into()); + fields: vec![PlutusData::BigInt(pallas_primitives::alonzo::BigInt::Int( + 2.into(), + ))], + })) + .into(), + ); assert_eq!(term.to_pretty(), "(con data (Constr 1 [I 2]))"); } #[test] fn constant_data_map() { - let term = Term::::Constant(Constant::Data( - PlutusData::Map(uplc::KeyValuePairs::Def(vec![ + let term = Term::::Constant( + Constant::Data(PlutusData::Map(uplc::KeyValuePairs::Def(vec![ ( PlutusData::BigInt(pallas_primitives::alonzo::BigInt::Int(0.into())), PlutusData::BoundedBytes(vec![0x00].into()), @@ -80,27 +125,35 @@ fn constant_data_map() { PlutusData::BigInt(pallas_primitives::alonzo::BigInt::Int(1.into())), PlutusData::BoundedBytes(vec![0x0f].into()), ), - ])) - ).into()); - assert_eq!(term.to_pretty(), "(con data (Map [(I 0, B #00), (I 1, B #0f)]))"); + ]))) + .into(), + ); + assert_eq!( + term.to_pretty(), + "(con data (Map [(I 0, B #00), (I 1, B #0f)]))" + ); } #[test] fn constant_data_list() { - let term = Term::::Constant(Constant::Data( - PlutusData::Array(vec![ + let term = Term::::Constant( + Constant::Data(PlutusData::Array(vec![ PlutusData::BigInt(pallas_primitives::alonzo::BigInt::Int(0.into())), PlutusData::BigInt(pallas_primitives::alonzo::BigInt::Int(1.into())), - ]) - ).into()); + ])) + .into(), + ); assert_eq!(term.to_pretty(), "(con data (List [I 0, I 1]))"); } #[test] fn constant_data_int() { - let term = Term::::Constant(Constant::Data( - PlutusData::BigInt(pallas_primitives::alonzo::BigInt::Int(2.into())), - ).into()); + let term = Term::::Constant( + Constant::Data(PlutusData::BigInt(pallas_primitives::alonzo::BigInt::Int( + 2.into(), + ))) + .into(), + ); assert_eq!(term.to_pretty(), "(con data (I 2))"); // TODO: large integers currently encode as bytestrings, which isn't great @@ -118,8 +171,8 @@ fn constant_data_int() { #[test] fn constant_data_bytes() { - let term = Term::::Constant(Constant::Data( - PlutusData::BoundedBytes(vec![0x00, 0x1A].into()), - ).into()); + let term = Term::::Constant( + Constant::Data(PlutusData::BoundedBytes(vec![0x00, 0x1A].into())).into(), + ); assert_eq!(term.to_pretty(), "(con data (B #001a))"); -} \ No newline at end of file +}