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 clippy::useless_borrows_in_formatting,
10 rustdoc::invalid_html_tags
11)]
12
13pub mod extensions {
17 include!(concat!(env!("OUT_DIR"), "/substrait.extensions.rs"));
18
19 #[cfg(feature = "serde")]
20 include!(concat!(env!("OUT_DIR"), "/substrait.extensions.serde.rs"));
21}
22
23include!(concat!(env!("OUT_DIR"), "/substrait.rs"));
24
25#[cfg(feature = "serde")]
26include!(concat!(env!("OUT_DIR"), "/substrait.serde.rs"));
27
28#[cfg(feature = "embed-descriptor")]
32pub const FILE_DESCRIPTOR_SET: &[u8] =
33 include_bytes!(concat!(env!("OUT_DIR"), "/proto_descriptor.bin"));
34
35#[cfg(test)]
36mod tests {
37 #[cfg(feature = "serde")]
38 #[test]
39 fn pbjson_serde() -> Result<(), Box<dyn std::error::Error>> {
40 let plan = serde_json::from_str::<super::Plan>(
41 r#"{
42 "version": { "minorNumber": 75, "producer": "substrait-rs" },
43 "extensionUrns": [
44 {
45 "extensionUrnAnchor": 1,
46 "urn": "extension:io.substrait:functions_string"
47 }
48 ]
49}"#,
50 )?;
51 assert_eq!(
52 plan.version,
53 Some(super::Version {
54 minor_number: 75,
55 producer: "substrait-rs".into(),
56 ..Default::default()
57 })
58 );
59 assert_eq!(plan.extension_urns.len(), 1);
60 Ok(())
61 }
62
63 #[cfg(feature = "serde")]
64 #[test]
65 fn forward_compatible_unknown_fields() -> Result<(), Box<dyn std::error::Error>> {
66 let plan = serde_json::from_str::<super::Plan>(
68 r#"{
69 "version": { "minorNumber": 75, "producer": "substrait-rs" },
70 "unknownField": "this field doesn't exist in the proto",
71 "anotherUnknownField": {"nested": "data"},
72 "extensionUrns": [
73 {
74 "extensionUrnAnchor": 1,
75 "urn": "extension:io.substrait:functions_string",
76 "futureField": "should be ignored"
77 }
78 ]
79}"#,
80 )?;
81 assert_eq!(
82 plan.version,
83 Some(super::Version {
84 minor_number: 75,
85 producer: "substrait-rs".into(),
86 ..Default::default()
87 })
88 );
89 assert_eq!(plan.extension_urns.len(), 1);
90 Ok(())
91 }
92
93 #[cfg(feature = "embed-descriptor")]
94 #[test]
95 fn file_descriptor_set_is_valid() {
96 use prost::Message;
97 let fds = prost_types::FileDescriptorSet::decode(super::FILE_DESCRIPTOR_SET).unwrap();
98 assert!(
99 fds.file.iter().any(|f| f.package() == "substrait"),
100 "expected substrait package in file descriptor set"
101 );
102 }
103}