dfir_lang/graph/ops/
source_json.rs
1use quote::quote_spanned;
2
3use super::{
4 FloType, OpInstGenerics, OperatorCategory, OperatorConstraints, OperatorInstance,
5 OperatorWriteOutput, WriteContextArgs, RANGE_0, RANGE_1,
6};
7
8pub const SOURCE_JSON: OperatorConstraints = OperatorConstraints {
19 name: "source_json",
20 categories: &[OperatorCategory::Source],
21 hard_range_inn: RANGE_0,
22 soft_range_inn: RANGE_0,
23 hard_range_out: RANGE_1,
24 soft_range_out: RANGE_1,
25 num_args: 1,
26 persistence_args: RANGE_0,
27 type_args: &(0..=1),
28 is_external_input: true,
29 has_singleton_output: false,
30 flo_type: Some(FloType::Source),
31 ports_inn: None,
32 ports_out: None,
33 input_delaytype_fn: |_| None,
34 write_fn: |wc @ &WriteContextArgs {
35 root,
36 op_span,
37 ident,
38 op_inst:
39 OperatorInstance {
40 generics: OpInstGenerics { type_args, .. },
41 ..
42 },
43 arguments,
44 ..
45 },
46 _| {
47 let generic_type = type_args.first().map(|ty| quote_spanned!(op_span=> : #ty));
48
49 let ident_jsonread = wc.make_ident("jsonread");
50 let write_prologue = quote_spanned! {op_span=>
51 let mut #ident_jsonread = {
54 let string = ::std::fs::read_to_string(#arguments).unwrap();
55 let value #generic_type = #root::serde_json::from_str(&string).unwrap();
56 ::std::iter::once(value)
57 };
58 };
59 let write_iterator = quote_spanned! {op_span=>
60 let #ident = #ident_jsonread.by_ref();
61 };
62 Ok(OperatorWriteOutput {
63 write_prologue,
64 write_iterator,
65 ..Default::default()
66 })
67 },
68};