Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

试图更新依赖 #1

Merged
merged 8 commits into from
Sep 2, 2024
Merged

试图更新依赖 #1

merged 8 commits into from
Sep 2, 2024

Conversation

Mikachu2333
Copy link
Owner

No description provided.

@Mikachu2333 Mikachu2333 changed the title 试图更新镜像 试图更新依赖 Aug 27, 2024
@Mikachu2333
Copy link
Owner Author

@wtklbm 大佬帮帮。

现在的问题有如下几个:

  1. cargo.rs 文件在更新了toml-edit依赖以后变得又臭又长,是否有其他办法改进?举例如下

导致该现象的主要原因是当不存在时,toml-edit在获取时就会直接报错,而无法调用.is_none()方法进行判断
(原来let xxx = &data[xxx][yyy];的结果是未明确的,需要在后面手动调用is_none判断,现在会直接在赋值的时候自动取值,取不到就报错。因此我用了一大堆的match去匹配导致长度不停增加,有事甚至会因为这样的语句&data[SOURCE][CRATES_IO][REPLACE_WITH]而嵌套3层以上的match……(先判断外面的存在,再判断里面的是否存在,逐层深入)……)

现在:

pub fn current(&mut self) -> (String, Option<String>) {
        let data = self.data.table_mut();

        // 从配置文件中获取镜像名
        let source = data[SOURCE][CRATES_IO].as_table().unwrap();
        let name = if source.contains_key(REPLACE_WITH) {
            match source[REPLACE_WITH].as_value().unwrap().as_str() {
                Some(name) => name,
                None => {
                    field_eprint(REPLACE_WITH, STRING);
                    process::exit(8);
                }
            }
        } else {
            RUST_LANG
        };

        // 从配置文件中根据镜像名获取镜像地址
        let addr = data[SOURCE][name][REGISTRY].as_str().map(|v| v.to_string());

        (name.to_string(), addr)
    }

原来:

pub fn current(&mut self) -> (String, Option<String>) {
        let data = self.data.table_mut();
        let replace_with = &data[SOURCE][CRATES_IO][REPLACE_WITH];

        // 从配置文件中获取镜像名
        let name = if !replace_with.is_none() {
            match replace_with.as_str() {
                Some(name) => name,
                None => {
                    field_eprint(REPLACE_WITH, STRING);
                    process::exit(8);
                }
            }
        } else {
            RUST_LANG
        };

        // 从配置文件中根据镜像名获取镜像地址
        let addr = data[SOURCE][name][REGISTRY].as_str().map(|v| v.to_string());

        (name.to_string(), addr)
    }

@Mikachu2333
Copy link
Owner Author

let name = if source.contains_key(REPLACE_WITH) {

注,这里利用的toml的特性偷懒了,理论上确实需要逐层判断是否存在……

@wtklbm
Copy link

wtklbm commented Aug 27, 2024

现在太晚了,等有空了慢慢琢磨哈

@Mikachu2333
Copy link
Owner Author

非常感谢!

@wtklbm
Copy link

wtklbm commented Aug 28, 2024

抱歉哈,没时间顾得上写这个。我怕您等久了,写了个小函数,您看用的上吗:

fn get_value_from_doc<'a>(entry: &'a DocumentMut, paths: &[&str]) -> Option<&'a Item> {
    let mut current_item: &Item = entry.as_item();

    for key in paths {
        if let Item::Table(table) = current_item {
            current_item = table.get(key)?;
        } else {
            return None;
        }
    }

    Some(current_item)
}

然后在 current 方法中,改成这么获取:

let data = &self.data.doc;
let keys = [SOURCE, CRATES_IO, REPLACE_WITH];

let name = match get_value_from_doc(&data, &keys) {
    Some(v) => v,
    None => {
        println!("值未找到");
        process::exit(1)
    }
};

println!("{}", v.to_string());

这个还可以写的简单一点,有什么问题可以继续探讨哈。

@Mikachu2333
Copy link
Owner Author

抱歉哈,没时间顾得上写这个。我怕您等久了,写了个小函数,您看用的上吗:

fn get_value_from_doc<'a>(entry: &'a DocumentMut, paths: &[&str]) -> Option<&'a Item> {
    let mut current_item: &Item = entry.as_item();

    for key in paths {
        if let Item::Table(table) = current_item {
            current_item = table.get(key)?;
        } else {
            return None;
        }
    }

    Some(current_item)
}

然后在 current 方法中,改成这么获取:

let data = &self.data.doc;
let keys = [SOURCE, CRATES_IO, REPLACE_WITH];

let name = match get_value_from_doc(&data, &keys) {
    Some(v) => v,
    None => {
        println!("值未找到");
        process::exit(1)
    }
};

println!("{}", v.to_string());

这个还可以写的简单一点,有什么问题可以继续探讨哈。

非常感谢您提供的思路,抽空我会继续完善一下的,现在还稍微有点小问题没能解决

@Mikachu2333 Mikachu2333 closed this Sep 2, 2024
@Mikachu2333 Mikachu2333 reopened this Sep 2, 2024
@Mikachu2333 Mikachu2333 merged commit 845d3a2 into main Sep 2, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants