git - 如何将常量映射到自定义字符串

标签 git rust

我正在使用git2 crate获取 statuses 的列表在 git 存储库上,这是我正在使用的代码:

use git2::{Repository, StatusOptions, StatusShow};
use std::{collections::HashMap, env};

fn main() {
    let path = env::current_dir().unwrap();
    let repo = Repository::discover(path).unwrap();
    let mut status_opt = StatusOptions::new();
    status_opt
        .show(StatusShow::IndexAndWorkdir)
        .include_untracked(true)
        .include_unmodified(false)
        .no_refresh(false);
    let status_result = repo.statuses(Some(&mut status_opt)).unwrap();

    let mut map: HashMap<git2::Status, u32> = HashMap::new();

    for status_entry in status_result.iter() {
        *map.entry(status_entry.status()).or_insert(0) += 1;
    }
    println!("{:?}", map);
}

根据当前存储库的修改返回git2::Status的 map 和出现次数,但我想向命令 git status --porcelain 返回类似的输出。

例如,根据存储库的更改,这是 git status --porcelain 的输出:

M  file_a
AM file_b
A  file_c
?? file_e
?? file_f

将输出传递给 awk:

$ git status --porcelain | awk -v ORS=", " 'NR>0{arr[$1]++}END{for (a in arr) print a, arr[a]}'
A 1, ?? 2, M 1, AM 1,

使用Rust上面的代码将返回:

{INDEX_NEW: 1, WT_NEW: 2, INDEX_NEW | WT_MODIFIED: 1, INDEX_MODIFIED: 1}

我想知道如何将 git2::Status 常量的值映射到自定义字符串(匹配瓷器字符串),例如:

INDEX_NEW                -> A 
INDEX_NEW | WT_MODIFIED  -> AM
INDEX_MODIFIED           -> M
WT_NEW                   -> ??

主要是如何处理像INDEX_NEW | 这样的情况WT_MODIFIED 将映射到例如 AM

最佳答案

以下代码片段获取您的 map 并将其转换为所需的表示形式。提供的示例将值收集到另一个 HashMap 中,并且它有一个发生紧急情况的 ARM ,但可以随意动态转换 git2::Status 值(即,当您第一次迭代它们)。

let mut output = HashMap::new();
for (key, value) in map.iter()
{
    let key = match key
    {

        s if s.contains(git2::Status::INDEX_NEW) &&
             s.contains(git2::Status::WT_MODIFIED) => "AM",
        s if s.contains(git2::Status::INDEX_NEW) => "A",
        s if s.contains(git2::Status::INDEX_MODIFIED) => "M",
        _ => panic!("Unexpected status"),
    };

    output.insert(key, value);
}

println!("{:?}", output);

如果您正在查看所选库的示例,那么您会发现非常相似的内容:git2-rs/examples/status.rs

有关模式匹配语法的更多信息,请参阅The Rust Programming Book .

关于git - 如何将常量映射到自定义字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56417990/

相关文章:

git - 有什么方法可以从闪存驱动器而不是 Git 推送和 pull 项目吗?

dll - 如何在共享库中动态调用函数?

rust - 如何排除在 OS X 上构建文件?

http - 从网页中检索 HTML 源

git - 如何压缩分支中的所有 merge ?

git - 恢复 git merge --abort 后删除的 git 文件

git - 在 bash 脚本中检测当前目录

java - Spring Cloud 配置在文件夹中组织文件

rust - 为什么协程有 future ?

json - 从 Rust 中的 Json 枚举中读取特定字段