use crate::error::SxurlError;
use crate::url::normalizer::normalize_url;
use crate::url::psl::extract_url_components;
use crate::core::packer::{pack_sxurl, sxurl_to_hex};
pub fn encode_url(url: &str) -> Result<[u8; 32], SxurlError> {
let normalized_url = normalize_url(url)?;
let components = extract_url_components(&normalized_url)?;
pack_sxurl(&components)
}
pub fn encode_url_to_hex(url: &str) -> Result<String, SxurlError> {
let sxurl_bytes = encode_url(url)?;
Ok(sxurl_to_hex(&sxurl_bytes))
}
pub struct SxurlEncoder {
}
impl SxurlEncoder {
pub fn new() -> Self {
Self {}
}
pub fn encode(&self, url: &str) -> Result<[u8; 32], SxurlError> {
encode_url(url)
}
pub fn encode_to_hex(&self, url: &str) -> Result<String, SxurlError> {
encode_url_to_hex(url)
}
}
impl Default for SxurlEncoder {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_encode_url_basic() {
let result = encode_url("https://example.com/");
assert!(result.is_ok());
let sxurl = result.unwrap();
assert_eq!(sxurl.len(), 32);
}
#[test]
fn test_encode_url_to_hex() {
let result = encode_url_to_hex("https://example.com/");
assert!(result.is_ok());
let hex = result.unwrap();
assert_eq!(hex.len(), 64);
assert!(hex.starts_with("100")); }
#[test]
fn test_encode_url_with_params() {
let result = encode_url_to_hex("https://google.com/search?q=test");
assert!(result.is_ok());
let hex = result.unwrap();
assert!(hex.starts_with("108")); }
#[test]
fn test_encode_invalid_scheme() {
let result = encode_url("ws://example.com/");
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), SxurlError::InvalidScheme));
}
#[test]
fn test_encoder_struct() {
let encoder = SxurlEncoder::new();
let result = encoder.encode_to_hex("https://docs.rs/");
assert!(result.is_ok());
let hex = result.unwrap();
assert_eq!(hex.len(), 64);
}
#[test]
fn test_encoder_default() {
let encoder = SxurlEncoder::default();
let result = encoder.encode("https://example.com/");
assert!(result.is_ok());
}
#[test]
fn test_normalize_and_encode() {
let result1 = encode_url_to_hex("HTTPS://EXAMPLE.COM/Path");
let result2 = encode_url_to_hex("https://example.com/Path");
assert!(result1.is_ok());
assert!(result2.is_ok());
assert_eq!(result1.unwrap(), result2.unwrap());
}
#[test]
fn test_idna_encoding() {
let result = encode_url("https://café.com/test");
assert!(result.is_ok());
}
#[test]
fn test_psl_integration() {
let result = encode_url_to_hex("https://api.example.co.uk/test");
assert!(result.is_ok());
let hex = result.unwrap();
let header_bits = u16::from_str_radix(&hex[0..3], 16).unwrap();
let sub_present = (header_bits & (1 << 4)) != 0;
assert!(sub_present, "Subdomain flag should be set for api.example.co.uk");
}
}