1#![allow(
4 clippy::doc_overindented_list_items,
5 clippy::large_enum_variant,
6 clippy::needless_borrow,
7 clippy::needless_borrows_for_generic_args,
8 clippy::needless_lifetimes,
9 rustdoc::invalid_html_tags
10)]
11
12pub mod extensions {
16 include!(concat!(env!("OUT_DIR"), "/substrait.extensions.rs"));
17
18 #[cfg(feature = "serde")]
19 include!(concat!(env!("OUT_DIR"), "/substrait.extensions.serde.rs"));
20}
21
22include!(concat!(env!("OUT_DIR"), "/substrait.rs"));
23
24#[cfg(feature = "serde")]
25include!(concat!(env!("OUT_DIR"), "/substrait.serde.rs"));
26
27#[cfg(test)]
28mod tests {
29 #[cfg(feature = "serde")]
30 #[test]
31 fn pbjson_serde() -> Result<(), Box<dyn std::error::Error>> {
32 let plan = serde_json::from_str::<super::Plan>(
33 r#"{
34 "version": { "minorNumber": 75, "producer": "substrait-rs" },
35 "extensionUrns": [
36 {
37 "extensionUrnAnchor": 1,
38 "urn": "extension:io.substrait:functions_string"
39 }
40 ]
41}"#,
42 )?;
43 assert_eq!(
44 plan.version,
45 Some(super::Version {
46 minor_number: 75,
47 producer: "substrait-rs".into(),
48 ..Default::default()
49 })
50 );
51 assert_eq!(plan.extension_urns.len(), 1);
52 Ok(())
53 }
54
55 #[cfg(feature = "serde")]
56 #[test]
57 fn forward_compatible_unknown_fields() -> Result<(), Box<dyn std::error::Error>> {
58 let plan = serde_json::from_str::<super::Plan>(
60 r#"{
61 "version": { "minorNumber": 75, "producer": "substrait-rs" },
62 "unknownField": "this field doesn't exist in the proto",
63 "anotherUnknownField": {"nested": "data"},
64 "extensionUrns": [
65 {
66 "extensionUrnAnchor": 1,
67 "urn": "extension:io.substrait:functions_string",
68 "futureField": "should be ignored"
69 }
70 ]
71}"#,
72 )?;
73 assert_eq!(
74 plan.version,
75 Some(super::Version {
76 minor_number: 75,
77 producer: "substrait-rs".into(),
78 ..Default::default()
79 })
80 );
81 assert_eq!(plan.extension_urns.len(), 1);
82 Ok(())
83 }
84}