// SPDX-FileCopyrightText: 2026 ahouts
//
// SPDX-License-Identifier: GPL-2.0-or-later
struct SlugRewriter {
rules: Vec<(String, String)>,
}
fn create_rewriter(match_prefixes: &[String], replace_prefixes: &[String]) -> Box<SlugRewriter> {
let rules: Vec<(String, String)> = match_prefixes
.iter()
.zip(replace_prefixes.iter())
.map(|(m, r)| (m.clone(), r.clone()))
.collect();
Box::new(SlugRewriter { rules })
}
impl SlugRewriter {
fn rewrite_url(&self, url: &str) -> ffi::RewriteResult {
for (match_prefix, replace_prefix) in &self.rules {
if url.starts_with(match_prefix.as_str()) {
let rewritten = format!("{}{}", replace_prefix, &url[match_prefix.len()..]);
return ffi::RewriteResult {
matched: true,
rewritten_url: rewritten,
};
}
}
ffi::RewriteResult {
matched: false,
rewritten_url: String::new(),
}
}
}
#[cxx::bridge]
mod ffi {
#[derive(Default)]
struct RewriteResult {
matched: bool,
#[cxx_name = "rewrittenUrl"]
rewritten_url: String,
}
extern "Rust" {
type SlugRewriter;
#[cxx_name = "createRewriter"]
fn create_rewriter(
match_prefixes: &[String],
replace_prefixes: &[String],
) -> Box<SlugRewriter>;
#[cxx_name = "rewriteUrl"]
fn rewrite_url(self: &SlugRewriter, url: &str) -> RewriteResult;
}
}