use http::Method;
use vorma_matcher::parse_segments;
use super::ResourceKind;
use crate::constants::{DYNAMIC_PARAM_PREFIX, SPLAT_SEGMENT_IDENTIFIER};
pub(super) fn validate_declared_route_pattern(kind: &str, pattern: &str) -> Result<(), String> {
if pattern.is_empty() {
return Err(format!("{kind} pattern must not be empty"));
}
if !pattern.starts_with('/') {
return Err(format!("{kind} pattern must be absolute"));
}
Ok(())
}
#[cfg(test)]
pub(super) fn default_resource_kind_for_method(method: &Method) -> ResourceKind {
if method == Method::GET || method == Method::HEAD {
ResourceKind::Query
} else {
ResourceKind::Mutation
}
}
#[doc(hidden)]
pub fn default_resource_kind(method: &str) -> ResourceKind {
if method == Method::GET.as_str() || method == Method::HEAD.as_str() {
ResourceKind::Query
} else {
ResourceKind::Mutation
}
}
#[doc(hidden)]
pub fn params_for_pattern(pattern: &str) -> Vec<String> {
parse_segments(pattern)
.into_iter()
.filter_map(|segment| {
segment
.strip_prefix(DYNAMIC_PARAM_PREFIX)
.map(ToOwned::to_owned)
})
.collect()
}
#[doc(hidden)]
pub fn pattern_is_splat(pattern: &str) -> bool {
parse_segments(pattern)
.last()
.is_some_and(|segment| segment == SPLAT_SEGMENT_IDENTIFIER.to_string().as_str())
}
#[doc(hidden)]
pub fn view_parents_for_patterns(pattern: &str, all_patterns: &[String]) -> Vec<String> {
let has_root_view = all_patterns.iter().any(|candidate| candidate == "/");
let mut parents = Vec::new();
if pattern != "/" && has_root_view {
parents.push("/".to_owned());
}
for maybe_parent in all_patterns {
if maybe_parent == pattern {
continue;
}
if pattern.starts_with(&format!("{maybe_parent}/")) {
parents.push(maybe_parent.clone());
}
}
parents
}