V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Cola98
V2EX  ›  Rust

请教一个 Rust 问题,提前祝大家中秋节快乐

  •  
  •   Cola98 · 81 天前 · 1520 次点击
    这是一个创建于 81 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近接触 rust ,心血来潮想写一个 rdb 解析工具,目前 aux 部分解析完成,但是每次解析出来的值都会覆盖掉之前的值,导致最后结果为空,以下是代码,跪求各位大佬解答 orz:

    impl ParserFactory {
        pub fn parse(rdb_context: &[u8]) -> Result<RDBInfo> {
            let mut cursor = Cursor::new(rdb_context);
            let base_info = BaseInfo::parse(&mut cursor)?;
            let rdb_version:usize = base_info.rdb_version.parse().expect("Not a valid number");
            let mut aux_info = None;
            let mut db_info=  None;
    
    
    
            // aux 只有 rdb 版本大于等于 7 才引入
            if rdb_version < 7 {
                aux_info = None
            };
    
            loop {
                // 读取标志位
                let mut flag_byte = [0;1];
                if cursor.read_exact(&mut flag_byte).is_err(){
                    break
                }
                match flag_byte[0] {
                    FA => {
                        aux_info = Some(AuxInfo::parse(&mut cursor)?);
                    }
                    FE => {
                        db_info = Some(DbInfo::parse(&mut cursor)?);
                    }
    
                    FF => {
                        println!("parse done.");
                        break
                    }
                    _ =>{
                        continue;
                    }
                }
            }
    
            // 组合 RDBInfo
            let rdb_info = RDBInfo {
                base_info,
                aux_info: aux_info.unwrap_or_else(|| AuxInfo {
                    redis_server_version: String::new(),
                    used_mem:0,
                }),
            };
    
            Ok(rdb_info)
        }
    
    }
    
    impl Parser for AuxInfo {
        fn parse(cursor: &mut Cursor<&[u8]>) -> Result<AuxInfo> {
            let mut aux_info = AuxInfo {
                redis_server_version: String::new(),
                used_mem: 0,
            };
            let aux_name = parser_aux_name(cursor)?;
    
            match aux_name.as_str() {
                "redis-ver" => {
                    aux_info.redis_server_version = parser_aux_value(cursor)?;
                }
                "used-mem" => {
                    aux_info.used_mem = parser_aux_value(cursor)?.parse::<usize>().expect("Failed to parse used-mem");
                }
    
                _ => {
    
                }
            }
            Ok(aux_info)
        }
    }
    
    7 条回复    2024-09-16 10:07:06 +08:00
    beimenjun
        1
    beimenjun  
       81 天前
    你有没有试过 ChatGPT ?
    Cola98
        2
    Cola98  
    OP
       81 天前
    @beimenjun 试了,但是效果一般
    Donaldo
        3
    Donaldo  
       81 天前
    你的问题描述的不清楚,什么叫“每次解析出来的值都会覆盖掉之前的值,导致最后结果为空”?是哪里为空?是最后返回的 rdb_info.aux_info 吗?
    nagisaushio
        4
    nagisaushio  
       81 天前 via Android
    不知道你在问什么,是返回的 rdb_info.aux_info 为空吗
    Cola98
        5
    Cola98  
    OP
       80 天前
    @Donaldo 嗯嗯是的
    Cola98
        6
    Cola98  
    OP
       80 天前
    @nagisaushio 是的,就是返回 aux_info
    PTLin
        7
    PTLin  
       80 天前
    来个最小 demo ,不过你要写解析库还是推荐用 nom
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1070 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 20:05 · PVG 04:05 · LAX 12:05 · JFK 15:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.