convertor 2.6.12

A profile converter for surge/clash.
Documentation
use serde::{Deserialize, Serialize};
use std::sync::LazyLock;

const REGIONS_CONTENT: &str = include_str!("../../assets/regions.json");

static REGIONS: LazyLock<Vec<Region>> = LazyLock::new(|| serde_json::from_str(REGIONS_CONTENT).unwrap());

#[derive(Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct Region {
    pub code: String,
    pub en: String,
    pub cn: String,
    pub icon: String,
}

impl Region {
    pub fn policy_name(&self) -> String {
        format!("{} {}", self.icon, self.cn)
    }

    pub fn detect(pattern: impl AsRef<str>) -> Option<&'static Self> {
        let pattern = pattern.as_ref();
        REGIONS.iter().find(|r| {
            let variants = [
                r.code.to_string(),
                r.code.to_lowercase(),
                r.en.to_lowercase(),
                r.en.to_uppercase(),
                r.en.replace(' ', "-"),
                r.en.replace(' ', "_"),
                r.en.replace(' ', ""),
                r.cn.to_string(),
            ];
            variants.iter().any(|v| pattern.contains(v))
        })
    }
}