#[cfg(feature = "bitcoin")]
pub mod bitcoin;
#[cfg(feature = "elements")]
pub mod elements;
mod init;
pub mod type_name;
#[cfg(feature = "bitcoin")]
pub use init::bitcoin::Bitcoin;
pub use init::core::Core;
#[cfg(feature = "elements")]
pub use init::elements::Elements;
use simplicity_sys::c_jets::frame_ffi::CFrameItem;
use crate::analysis::Cost;
use crate::decode;
use crate::jet::type_name::TypeName;
use crate::merkle::cmr::Cmr;
use crate::{BitIter, BitWriter};
use std::hash::Hash;
use std::io::Write;
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
pub struct JetFailed;
impl std::fmt::Display for JetFailed {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
f.write_str("Jet failed during execution")
}
}
impl std::error::Error for JetFailed {}
pub trait Jet:
Copy + Eq + Ord + Hash + std::fmt::Debug + std::fmt::Display + std::str::FromStr + 'static
{
type Environment;
type CJetEnvironment;
fn cmr(&self) -> Cmr;
fn source_ty(&self) -> TypeName;
fn target_ty(&self) -> TypeName;
fn encode<W: Write>(&self, w: &mut BitWriter<W>) -> std::io::Result<usize>;
fn decode<I: Iterator<Item = u8>>(bits: &mut BitIter<I>) -> Result<Self, decode::Error>;
fn c_jet_env(env: &Self::Environment) -> &Self::CJetEnvironment;
fn c_jet_ptr(&self) -> &dyn Fn(&mut CFrameItem, CFrameItem, &Self::CJetEnvironment) -> bool;
fn cost(&self) -> Cost;
}
#[cfg(test)]
mod tests {
use crate::jet::Core;
use crate::node::{ConstructNode, CoreConstructible, JetConstructible};
use crate::types;
use crate::{BitMachine, Value};
use std::sync::Arc;
#[test]
fn test_ffi_jet() {
let ctx = types::Context::new();
let two_words = Arc::<ConstructNode<_>>::comp(
&Arc::<ConstructNode<_>>::pair(
&Arc::<ConstructNode<_>>::const_word(&ctx, Value::u32(2)),
&Arc::<ConstructNode<_>>::const_word(&ctx, Value::u32(16)),
)
.unwrap(),
&Arc::<ConstructNode<_>>::jet(&ctx, Core::Add32),
)
.unwrap();
assert_eq!(
BitMachine::test_exec(two_words, &()).expect("executing"),
Value::product(
Value::u1(0), Value::u32(2 + 16), ),
);
}
#[test]
fn test_simple() {
let ctx = types::Context::new();
let two_words = Arc::<ConstructNode<Core>>::pair(
&Arc::<ConstructNode<_>>::const_word(&ctx, Value::u32(2)),
&Arc::<ConstructNode<_>>::const_word(&ctx, Value::u16(16)),
)
.unwrap();
assert_eq!(
BitMachine::test_exec(two_words, &()).expect("executing"),
Value::product(Value::u32(2), Value::u16(16)),
);
}
}