1pub mod errors;
2pub mod spec;
3
4pub use spec::*;
5
6use tx3_tir::{
7 encoding::{AnyTir, TirVersion},
8 reduce::ArgMap,
9};
10
11use crate::{
12 interop::{self, base64_to_bytes, hex_to_bytes, BytesEncoding},
13 Error,
14};
15
16impl From<TirEnvelope> for Vec<u8> {
17 fn from(envelope: TirEnvelope) -> Self {
18 match envelope.encoding {
19 BytesEncoding::Base64 => base64_to_bytes(&envelope.content).unwrap(),
20 BytesEncoding::Hex => hex_to_bytes(&envelope.content).unwrap(),
21 }
22 }
23}
24
25impl TryFrom<TirEnvelope> for AnyTir {
26 type Error = Error;
27
28 fn try_from(envelope: TirEnvelope) -> Result<Self, Self::Error> {
29 let version = TirVersion::try_from(envelope.version.as_str())?;
30
31 let bytes: Vec<u8> = envelope.into();
32
33 let tir = tx3_tir::encoding::from_bytes(&bytes, version)?;
34
35 Ok(tir)
36 }
37}
38
39pub fn parse_resolve_request(request: spec::ResolveParams) -> Result<(AnyTir, ArgMap), Error> {
40 let tir = AnyTir::try_from(request.tir)?;
41
42 let params = tx3_tir::reduce::find_params(&tir);
43 let mut args = ArgMap::new();
44
45 for (key, val) in request.args {
46 if let Some(ty) = params.get(&key) {
47 let arg = interop::from_json(val.clone(), &ty)?;
48 args.insert(key, arg);
49 }
50 }
51
52 Ok((tir, args))
53}