use bp::bc::stl::bitcoin_stl;
use strict_types::stl::std_stl;
use strict_types::typelib::{LibBuilder, TranslateError};
use strict_types::typesys::SystemBuilder;
use strict_types::{SemId, TypeLib, TypeSystem};
use super::{
DivisibleAssetSpec, Error, MediaType, RicardianContract, Timestamp, LIB_NAME_RGB_CONTRACT,
};
use crate::stl::ProofOfReserves;
pub const LIB_ID_RGB_CONTRACT: &str =
"level_decide_percent_6z2gZQEJsnP4xoNUC94vqYEE9V7gKQbeJhb5521xta5u";
fn _rgb_contract_stl() -> Result<TypeLib, TranslateError> {
LibBuilder::new(libname!(LIB_NAME_RGB_CONTRACT))
.transpile::<Timestamp>()
.transpile::<DivisibleAssetSpec>()
.transpile::<RicardianContract>()
.transpile::<MediaType>()
.transpile::<ProofOfReserves>()
.compile(bset! {
std_stl().to_dependency(),
bitcoin_stl().to_dependency()
})
}
pub fn rgb_contract_stl() -> TypeLib {
_rgb_contract_stl().expect("invalid strict type RGBContract library")
}
#[derive(Debug)]
pub struct StandardTypes(TypeSystem);
impl StandardTypes {
pub fn new() -> Self {
Self::try_with([std_stl(), bitcoin_stl(), rgb_contract_stl()])
.expect("error in standard RGBContract type system")
}
pub fn with(lib: TypeLib) -> Self {
Self::try_with([std_stl(), bitcoin_stl(), rgb_contract_stl(), lib])
.expect("error in standard RGBContract type system")
}
fn try_with(libs: impl IntoIterator<Item = TypeLib>) -> Result<Self, Error> {
let mut builder = SystemBuilder::new();
for lib in libs.into_iter() {
builder = builder.import(lib)?;
}
let sys = builder.finalize()?;
Ok(Self(sys))
}
pub fn type_system(&self) -> TypeSystem { self.0.clone() }
pub fn get(&self, name: &'static str) -> SemId {
self.0.id_by_name(name).unwrap_or_else(|| {
panic!("type '{name}' is absent in standard RGBContract type library")
})
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn lib_id() {
let lib = rgb_contract_stl();
assert_eq!(lib.id().to_string(), LIB_ID_RGB_CONTRACT);
}
}