pub use paste::paste;
use crate::map;
pub use crate::r#enum::Enum;
use crate::repeated;
pub use crate::ProtoStr;
use crate::Proxied;
pub use std::fmt::Debug;
#[cfg(all(bzl, cpp_kernel))]
#[path = "cpp.rs"]
pub mod runtime;
#[cfg(any(not(bzl), upb_kernel))]
#[path = "upb.rs"]
pub mod runtime;
#[derive(Debug)]
pub struct Private;
pub trait SealedInternal: Sized {}
pub trait MatcherEq: SealedInternal + Debug {
fn matches(&self, o: &Self) -> bool;
}
pub fn get_repeated_default_value<T: repeated::ProxiedInRepeated + Default>(
_: Private,
_: repeated::RepeatedView<'_, T>,
) -> T {
Default::default()
}
pub fn get_map_default_value<K: Proxied, V: map::ProxiedInMapValue<K> + Default>(
_: Private,
_: map::MapView<'_, K, V>,
) -> V {
Default::default()
}
#[cfg(not(bzl))]
const fn split_version(version: &str) -> (u32, u32, u32, u32) {
let version = version.as_bytes();
let mut result: [u32; 4] = [0, 0, 0, 0];
let mut result_index = 0;
let mut i = 0;
while result_index < result.len() && i < version.len() {
if version[i] == b'.' {
result_index += 1;
} else if version[i] >= b'0' && version[i] <= b'9' {
result[result_index] = result[result_index] * 10 + (version[i] - b'0') as u32;
}
i += 1;
}
(result[0], result[1], result[2], result[3])
}
#[cfg(not(bzl))]
const fn are_versions_compatible(gencode: &str, runtime: &str) -> bool {
let gencode = split_version(gencode);
let runtime = split_version(runtime);
if gencode.0 < 4 || (gencode.0 == 4 && gencode.1 <= 32) {
return false;
}
if gencode.0 != runtime.0 {
return gencode.0 < runtime.0;
}
if gencode.1 != runtime.1 {
return gencode.1 < runtime.1;
}
if gencode.2 != runtime.2 {
return gencode.2 < runtime.2;
}
let gencode_rc = if gencode.3 == 0 { u32::MAX } else { gencode.3 };
let runtime_rc = if runtime.3 == 0 { u32::MAX } else { runtime.3 };
gencode_rc <= runtime_rc
}
#[cfg(not(bzl))]
pub const fn assert_compatible_gencode_version(gencode_version: &'static str) {
let runtime_version = env!("CARGO_PKG_VERSION");
assert!(
are_versions_compatible(gencode_version, runtime_version),
"Gencode version is not compatible with runtime version",
)
}
#[cfg(bzl)]
pub const fn assert_compatible_gencode_version(_gencode_version: &'static str) {}
#[cfg(test)]
#[cfg(not(bzl))]
mod tests {
use super::*;
use googletest::prelude::*;
#[gtest]
fn test_split_version() {
expect_that!(split_version("4.33.1"), eq((4, 33, 1, 0)));
expect_that!(split_version("4.33.0-rc.1"), eq((4, 33, 0, 1)));
expect_that!(split_version("4.33.0-release"), eq((4, 33, 0, 0)));
}
#[gtest]
fn test_are_versions_compatible() {
expect_false!(are_versions_compatible("4.32.0", "4.32.1"));
expect_false!(are_versions_compatible("3.32.0", "3.32.0"));
expect_true!(are_versions_compatible("4.33.0-rc.1", "4.33.0-rc.1"));
expect_true!(are_versions_compatible("4.33.1", "4.33.1"));
expect_true!(are_versions_compatible("4.33.0", "5.34.0"));
expect_true!(are_versions_compatible("4.33.0", "4.34.0"));
expect_true!(are_versions_compatible("4.33.0", "4.33.1"));
expect_true!(are_versions_compatible("4.33.0-rc.1", "4.33.0-rc.2"));
expect_true!(are_versions_compatible("4.33.0-rc.2", "4.33.0"));
expect_false!(are_versions_compatible("5.34.0", "4.33.0"));
expect_false!(are_versions_compatible("4.34.0", "4.33.0"));
expect_false!(are_versions_compatible("4.33.1", "4.33.0"));
expect_false!(are_versions_compatible("4.33.0-rc.2", "4.33.0-rc.1"));
expect_false!(are_versions_compatible("4.33.0", "4.33.0-rc.2"));
}
}