/// 字符串相关操作
pub struct StrUtil;

impl StrUtil {
    /// 将字符串按照指定分隔符进行分割
    ///
    /// # 参数
    /// * `str` - 需要分割的字符串切片
    /// * `delimiter` - 用作分割依据的分隔符字符串
    ///
    /// # 返回值
    /// 返回一个包含分割后子字符串的向量，每个元素都是原字符串的切片引用
    ///
    /// # 示例
    /// ```
    /// let result = split("hello,world,rust", ",");
    /// assert_eq!(result, vec!["hello", "world", "rust"]);
    /// ```
    pub fn split<'a>(str: &'a str, delimiter: &str) -> Vec<&'a str> {
        str.split(delimiter).collect()
    }

    /// 从字符串右侧开始查找分隔符，并将字符串分割为两部分
    /// 
    /// # 参数
    /// * [s](file://d:\git-repo-rust\mitoo\src\id_util.rs) - 需要分割的字符串切片
    /// * `delimiter` - 用作分割依据的分隔符字符串
    /// 
    /// # 返回值
    /// 返回一个Option类型，如果找到分隔符则包含分割后的两个字符串切片的元组，
    /// 第一个元素是分隔符左侧的部分，第二个元素是分隔符右侧的部分；
    /// 如果未找到分隔符则返回None
    pub fn rsplit<'a>(s: &'a str, delimiter: &str) -> Option<(&'a str, &'a str)> {
        // 找到最后一个分隔符的索引位置
        s.rfind(delimiter).map(|index| {
            // 分割为两部分：索引位置前的部分和之后的部分
            (&s[..index], &s[index + 1..])
        })
    }

    /// 从字符串中移除指定的前缀
    ///
    /// 如果字符串以指定前缀开头，则返回移除前缀后的字符串；
    /// 否则返回原字符串的副本。
    ///
    /// # 参数
    /// * `str` - 需要处理的原始字符串
    /// * `prefix` - 要移除的前缀字符串
    ///
    /// # 返回值
    /// 返回移除前缀后的字符串，如果不需要移除前缀则返回原字符串的副本
    pub fn remove_prefix(str: &str, prefix: &str) -> String {
        // 检查字符串是否以指定前缀开头
        if str.starts_with(prefix) {
            // 如果是，则返回移除前缀后的子字符串
            return str[prefix.len()..].to_string();
        }
        // 如果不是以指定前缀开头，返回原字符串的副本
        str.to_string()
    }

    /// 从字符串中移除指定的后缀
    ///
    /// 如果字符串以指定后缀结尾，则返回移除该后缀后的字符串；
    /// 否则返回原字符串的副本。
    ///
    /// # 参数
    /// * `str` - 需要处理的原始字符串
    /// * `suffix` - 要移除的后缀字符串
    ///
    /// # 返回值
    /// 返回处理后的字符串。如果原字符串以指定后缀结尾，则返回移除后缀后的字符串；
    /// 否则返回原字符串的副本。
    pub fn remove_suffix(str: &str, suffix: &str) -> String {
        // 检查字符串是否以指定后缀结尾
        if str.ends_with(suffix) {
            // 移除后缀并返回新字符串
            return str[..str.len() - suffix.len()].to_string();
        }
        // 如果不以后缀结尾，返回原字符串副本
        str.to_string()
    }

    /// 字符串反转
    pub fn reverse(str: &str) -> String {
        // 创建一个空的字符串用于存储反转后的结果
        let mut reversed = String::new();
        // 遍历字符串的每个字符
        for c in str.chars() {
            // 在每次迭代中，将当前字符添加到反转后的字符串的开头
            reversed.insert(0, c);
        }
        // 返回反转后的字符串
        reversed
    }
    
}
