//! 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. OID hex strings are always safe. /// /// 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)) => 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)) => oid.hex, Some($crate::pb::object_selector::Selector::Revision(name)) => { $crate::sanitize::validate_revision(&name.revision)?; name.revision } None => ($default).into(), } }}; }