rinova-proxy-sdk 1.0.0

Proxy subscription to Clash config converter — SDK
Documentation
pub fn pad_base64(s: &str) -> String {
    let rem = s.len() % 4;
    if rem == 0 {
        s.to_string()
    } else {
        format!("{}{}", s, "=".repeat(4 - rem))
    }
}

pub fn safe_decode_uri(s: Option<&str>) -> String {
    match s {
        None | Some("") => String::new(),
        Some(raw) => urlencoding::decode(raw)
            .map(|decoded| decoded.into_owned())
            .unwrap_or_else(|_| raw.to_string()),
    }
}

pub fn decode_base64_utf8(s: &str) -> Result<String, base64::DecodeError> {
    use base64::Engine;
    let bytes = base64::engine::general_purpose::STANDARD.decode(pad_base64(s))?;
    Ok(String::from_utf8_lossy(&bytes).into_owned())
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn pad_base64_adds_padding() {
        assert_eq!(pad_base64("YWJj"), "YWJj");
        assert_eq!(pad_base64("YWJjZA"), "YWJjZA==");
    }

    #[test]
    fn safe_decode_uri_handles_percent() {
        assert_eq!(safe_decode_uri(Some("%E7%BE%8E%E5%9B%BD")), "美国");
        assert_eq!(safe_decode_uri(None), "");
    }
}