Files

45 lines
1.6 KiB
Rust

//! Copyright (c) 2022-2026 GitDataAi All rights reserved.
//! Helper macro to extract and validate a revision selector.
//!
//! Replaces the repeated pattern of matching on ObjectSelector variants
//! and validating revision strings before use.
/// Extract a revision string from an optional ObjectSelector, applying
/// validation to revision names and OID hex strings.
///
/// Returns "HEAD" when selector is None.
///
/// Usage:
/// let revision = resolve_revision!(request.base);
/// let revision = resolve_revision!(request.base, "main");
#[macro_export]
macro_rules! resolve_revision {
($selector:expr) => {{
match $selector.and_then(|s| s.selector) {
Some($crate::pb::object_selector::Selector::Oid(oid)) => {
$crate::sanitize::validate_oid_hex(&oid.hex)?;
oid.hex
}
Some($crate::pb::object_selector::Selector::Revision(name)) => {
$crate::sanitize::validate_revision(&name.revision)?;
name.revision
}
None => "HEAD".into(),
}
}};
($selector:expr, $default:expr) => {{
match $selector.and_then(|s| s.selector) {
Some($crate::pb::object_selector::Selector::Oid(oid)) => {
$crate::sanitize::validate_oid_hex(&oid.hex)?;
oid.hex
}
Some($crate::pb::object_selector::Selector::Revision(name)) => {
$crate::sanitize::validate_revision(&name.revision)?;
name.revision
}
None => ($default).into(),
}
}};
}