Skip to main content

tx3_resolver/trp/
mod.rs

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}