dfir_lang/graph/ops/
join_fused_rhs.rs
1use quote::{quote_spanned, ToTokens};
2use syn::parse_quote;
3
4use super::{
5 DelayType, OperatorCategory, OperatorConstraints, OperatorWriteOutput,
6 PortIndexValue, WriteContextArgs, RANGE_0, RANGE_1,
7};
8
9pub const JOIN_FUSED_RHS: OperatorConstraints = OperatorConstraints {
13 name: "join_fused_rhs",
14 categories: &[OperatorCategory::MultiIn],
15 hard_range_inn: &(2..=2),
16 soft_range_inn: &(2..=2),
17 hard_range_out: RANGE_1,
18 soft_range_out: RANGE_1,
19 num_args: 1,
20 persistence_args: &(0..=2),
21 type_args: RANGE_0,
22 is_external_input: false,
23 has_singleton_output: false,
24 flo_type: None,
25 ports_inn: Some(|| super::PortListSpec::Fixed(parse_quote! { 0, 1 })),
26 ports_out: None,
27 input_delaytype_fn: |idx| match idx {
28 PortIndexValue::Int(path) if "1" == path.to_token_stream().to_string() => {
29 Some(DelayType::Stratum)
30 }
31 _ => None,
32 },
33 write_fn: |wc @ &WriteContextArgs {
34 op_span,
35 ident,
36 inputs,
37 ..
38 },
39 diagnostics| {
40 let inputs = inputs.iter().cloned().rev().collect::<Vec<_>>();
41
42 let wc = WriteContextArgs {
43 inputs: &inputs[..],
44 ..wc.clone()
45 };
46
47 let OperatorWriteOutput {
48 write_prologue,
49 write_iterator,
50 write_iterator_after,
51 } = (super::join_fused_lhs::JOIN_FUSED_LHS.write_fn)(&wc, diagnostics)?;
52
53 let write_iterator = quote_spanned! {op_span=>
54 #write_iterator
55 let #ident = #ident.map(|(k, (v1, v2))| (k, (v2, v1)));
56 };
57
58 Ok(OperatorWriteOutput {
59 write_prologue,
60 write_iterator,
61 write_iterator_after,
62 })
63 },
64};