feat: wrap up adding uplc builtins for now

This commit is contained in:
rvcas
2022-10-25 14:52:29 -04:00
committed by Lucas
parent d5d2ba9cd7
commit 819256df99
12 changed files with 222 additions and 110 deletions

View File

@@ -1,5 +1,7 @@
use std::{cell::RefCell, collections::HashMap, sync::Arc};
use strum::IntoEnumIterator;
use uplc::builtins::DefaultFunction;
use crate::{
@@ -212,7 +214,7 @@ pub fn prelude(id_gen: &IdGenerator) -> TypeInfo {
prelude
}
pub fn plutus() -> TypeInfo {
pub fn plutus(id_gen: &IdGenerator) -> TypeInfo {
let mut plutus = TypeInfo {
name: "aiken/builtin".to_string(),
package: "".to_string(),
@@ -223,101 +225,174 @@ pub fn plutus() -> TypeInfo {
accessors: HashMap::new(),
};
plutus.values.insert(
DefaultFunction::AddInteger.to_string(),
DefaultFunction::AddInteger.into(),
);
plutus.values.insert(
DefaultFunction::SubtractInteger.to_string(),
DefaultFunction::SubtractInteger.into(),
);
plutus.values.insert(
DefaultFunction::MultiplyInteger.to_string(),
DefaultFunction::MultiplyInteger.into(),
);
plutus.values.insert(
DefaultFunction::DivideInteger.to_string(),
DefaultFunction::DivideInteger.into(),
);
for builtin in DefaultFunction::iter() {
if let Some(value) = from_default_function(builtin, id_gen) {
plutus.values.insert(
builtin.to_string().replace("ByteString", "ByteArray"),
value,
);
}
}
plutus
}
impl From<DefaultFunction> for ValueConstructor {
fn from(builtin: DefaultFunction) -> Self {
let (tipo, arity) = match builtin {
DefaultFunction::AddInteger
| DefaultFunction::SubtractInteger
| DefaultFunction::MultiplyInteger
| DefaultFunction::DivideInteger
| DefaultFunction::QuotientInteger
| DefaultFunction::RemainderInteger
| DefaultFunction::ModInteger => {
let tipo = function(vec![int(), int()], int());
pub fn from_default_function(
builtin: DefaultFunction,
id_gen: &IdGenerator,
) -> Option<ValueConstructor> {
let info = match builtin {
DefaultFunction::AddInteger
| DefaultFunction::SubtractInteger
| DefaultFunction::MultiplyInteger
| DefaultFunction::DivideInteger
| DefaultFunction::QuotientInteger
| DefaultFunction::RemainderInteger
| DefaultFunction::ModInteger => {
let tipo = function(vec![int(), int()], int());
(tipo, 2)
}
Some((tipo, 2))
}
DefaultFunction::EqualsInteger
| DefaultFunction::LessThanInteger
| DefaultFunction::LessThanEqualsInteger => {
let tipo = function(vec![int(), int()], bool());
DefaultFunction::EqualsInteger
| DefaultFunction::LessThanInteger
| DefaultFunction::LessThanEqualsInteger => {
let tipo = function(vec![int(), int()], bool());
(tipo, 2)
}
DefaultFunction::AppendByteString => todo!(),
DefaultFunction::ConsByteString => todo!(),
DefaultFunction::SliceByteString => todo!(),
DefaultFunction::LengthOfByteString => todo!(),
DefaultFunction::IndexByteString => todo!(),
DefaultFunction::EqualsByteString => todo!(),
DefaultFunction::LessThanByteString => todo!(),
DefaultFunction::LessThanEqualsByteString => todo!(),
DefaultFunction::Sha2_256 => todo!(),
DefaultFunction::Sha3_256 => todo!(),
DefaultFunction::Blake2b_256 => todo!(),
DefaultFunction::VerifyEd25519Signature => todo!(),
DefaultFunction::VerifyEcdsaSecp256k1Signature => todo!(),
DefaultFunction::VerifySchnorrSecp256k1Signature => todo!(),
DefaultFunction::AppendString => todo!(),
DefaultFunction::EqualsString => todo!(),
DefaultFunction::EncodeUtf8 => todo!(),
DefaultFunction::DecodeUtf8 => todo!(),
DefaultFunction::IfThenElse => todo!(),
DefaultFunction::ChooseUnit => todo!(),
DefaultFunction::Trace => todo!(),
DefaultFunction::FstPair => todo!(),
DefaultFunction::SndPair => todo!(),
DefaultFunction::ChooseList => todo!(),
DefaultFunction::MkCons => todo!(),
DefaultFunction::HeadList => todo!(),
DefaultFunction::TailList => todo!(),
DefaultFunction::NullList => todo!(),
DefaultFunction::ChooseData => todo!(),
DefaultFunction::ConstrData => todo!(),
DefaultFunction::MapData => todo!(),
DefaultFunction::ListData => todo!(),
DefaultFunction::IData => todo!(),
DefaultFunction::BData => todo!(),
DefaultFunction::UnConstrData => todo!(),
DefaultFunction::UnMapData => todo!(),
DefaultFunction::UnListData => todo!(),
DefaultFunction::UnIData => todo!(),
DefaultFunction::UnBData => todo!(),
DefaultFunction::EqualsData => todo!(),
DefaultFunction::SerialiseData => todo!(),
DefaultFunction::MkPairData => todo!(),
DefaultFunction::MkNilData => todo!(),
DefaultFunction::MkNilPairData => todo!(),
};
Some((tipo, 2))
}
DefaultFunction::AppendByteString => {
let tipo = function(vec![byte_array(), byte_array()], byte_array());
Some((tipo, 2))
}
DefaultFunction::ConsByteString => {
let tipo = function(vec![int(), byte_array()], byte_array());
Some((tipo, 2))
}
DefaultFunction::SliceByteString => {
let tipo = function(vec![int(), int(), byte_array()], byte_array());
Some((tipo, 3))
}
DefaultFunction::LengthOfByteString => {
let tipo = function(vec![byte_array()], int());
Some((tipo, 1))
}
DefaultFunction::IndexByteString => {
let tipo = function(vec![byte_array(), int()], int());
Some((tipo, 2))
}
DefaultFunction::EqualsByteString
| DefaultFunction::LessThanByteString
| DefaultFunction::LessThanEqualsByteString => {
let tipo = function(vec![byte_array(), byte_array()], bool());
Some((tipo, 2))
}
DefaultFunction::Sha2_256 | DefaultFunction::Sha3_256 | DefaultFunction::Blake2b_256 => {
let tipo = function(vec![byte_array()], byte_array());
Some((tipo, 1))
}
DefaultFunction::VerifyEd25519Signature => {
let tipo = function(vec![byte_array(), byte_array(), byte_array()], bool());
Some((tipo, 3))
}
DefaultFunction::VerifyEcdsaSecp256k1Signature => None,
DefaultFunction::VerifySchnorrSecp256k1Signature => None,
DefaultFunction::AppendString => {
let tipo = function(vec![string(), string()], string());
Some((tipo, 2))
}
DefaultFunction::EqualsString => {
let tipo = function(vec![string(), string()], bool());
Some((tipo, 2))
}
DefaultFunction::EncodeUtf8 => {
let tipo = function(vec![string()], byte_array());
Some((tipo, 1))
}
DefaultFunction::DecodeUtf8 => {
let tipo = function(vec![byte_array()], string());
Some((tipo, 1))
}
DefaultFunction::IfThenElse => None,
DefaultFunction::ChooseUnit => None,
DefaultFunction::Trace => {
let ret = generic_var(id_gen.next());
let tipo = function(vec![string(), ret.clone()], ret);
Some((tipo, 2))
}
DefaultFunction::FstPair => None,
DefaultFunction::SndPair => None,
DefaultFunction::ChooseList => None,
DefaultFunction::MkCons => None,
DefaultFunction::HeadList => {
let ret = generic_var(id_gen.next());
let tipo = function(vec![list(ret.clone())], ret);
Some((tipo, 1))
}
DefaultFunction::TailList => {
let ret = list(generic_var(id_gen.next()));
let tipo = function(vec![ret.clone()], ret);
Some((tipo, 1))
}
DefaultFunction::NullList => {
let ret = list(generic_var(id_gen.next()));
let tipo = function(vec![ret], bool());
Some((tipo, 1))
}
DefaultFunction::ChooseData => None,
DefaultFunction::ConstrData => None,
DefaultFunction::MapData => None,
DefaultFunction::ListData => None,
DefaultFunction::IData => None,
DefaultFunction::BData => None,
DefaultFunction::UnConstrData => None,
DefaultFunction::UnMapData => None,
DefaultFunction::UnListData => None,
DefaultFunction::UnIData => None,
DefaultFunction::UnBData => None,
DefaultFunction::EqualsData => {
let arg = generic_var(id_gen.next());
let tipo = function(vec![arg.clone(), arg], bool());
Some((tipo, 1))
}
DefaultFunction::SerialiseData => {
let tipo = function(vec![generic_var(id_gen.next())], byte_array());
Some((tipo, 1))
}
DefaultFunction::MkPairData => None,
DefaultFunction::MkNilData => None,
DefaultFunction::MkNilPairData => None,
};
info.map(|(tipo, arity)| {
ValueConstructor::public(
tipo,
ValueConstructorVariant::ModuleFn {
name: builtin.to_string(),
name: builtin.to_string().replace("ByteString", "ByteArray"),
field_map: None,
module: "".to_string(),
arity,
@@ -325,7 +400,7 @@ impl From<DefaultFunction> for ValueConstructor {
builtin: Some(builtin),
},
)
}
})
}
pub fn int() -> Arc<Type> {