//! 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(), } }}; }