Skip to main content

substrait/
proto.rs

1// SPDX-License-Identifier: Apache-2.0
2
3#![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
13//! Generated types for the protobuf `substrait` package.
14
15/// Generated types for the protobuf `substrait.extensions` package
16pub 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/// The encoded file descriptor set for the Substrait protobuf definitions.
29///
30/// This can be used for protobuf reflection.
31#[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        // Test that unknown fields are ignored for forward compatibility
67        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}