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