Rust开发一个命令行工具(一,简单版持续更新)

依赖的包

cargo add clap --features derive
clap命令行参数解析

项目目录

在这里插入图片描述

代码

main.rs

mod utils;

use clap::Parser;
use utils::{
    editor::open_in_vscode,
    fs_tools::{file_exists, get_file, is_dir, list_dir, read_file},
};
/// 在文件中搜索模式并显示包含它的行。
#[derive(Parser)]
struct Cli {
    /// 要读取的文件的路径
    path: std::path::PathBuf,
    /// 项目文件夹路径
    dir: std::path::PathBuf,
}
fn main() {
    let args = Cli::parse();
    let path = args.path;
    let dir = args.dir;
    if !is_dir(&dir.to_str().unwrap()) {
        if !file_exists(&path.to_str().unwrap()) {
            println!("文件不存在");
            std::process::exit(1);
        }
        let file = get_file(&path.to_str().unwrap()).expect("无法打开文件");
        match read_file(file) {
            Ok(content) => println!("{:?}", content),
            Err(e) => println!("读取文件失败: {:?}", e),
        }
    } else {
        open_in_vscode(&dir.to_str().unwrap());
    }
}

utils/fs_tools.rs

use std::io::Read;

// 读取文件
pub fn read_file(file: std::fs::File) -> Result<String, std::io::Error> {
    let mut reader = std::io::BufReader::new(file);
    let mut contents = String::new();
    reader.read_to_string(&mut contents)?;
    Ok(contents)
}
// 文件是否存在
pub fn file_exists(path: &str) -> bool {
    std::path::Path::new(path).exists()
}
// 打开文件
pub fn get_file(path: &str) -> Result<std::fs::File, std::io::Error> {
    std::fs::File::open(path)
}
// 是否为文件夹
pub fn is_dir(path: &str) -> bool {
    std::path::Path::new(path).is_dir()
}
// 列出该文件夹内的所有文件或文件夹
pub fn list_dir(path: &str) -> Result<Vec<String>, std::io::Error> {
    let files = std::fs::read_dir(path)?;
    let mut file_list = Vec::new();
    for file in files {
        file_list.push(file.unwrap().path().to_str().unwrap().to_string());
    }
    Ok(file_list)
}

utils/editor.rs

pub fn open_in_vscode(path: &str) {
    let cmd = format!("code {}", path);
    std::process::Command::new("sh")
        .arg("-c")
        .arg(cmd)
        .spawn()
        .expect("无法打开文件夹");
}

utils/mod.rs

pub mod editor;
pub mod fs_tools;

本地测试

cargo run -- fancy dir

打包构建

cargo build --release
cargo build --release 是一个 Cargo 命令,用于构建 Rust 项目并生成优化后的二进制文件或库。
cargo build 是 Cargo 的一个命令,用于编译和构建 Rust 项目。它会根据项目的 Cargo.toml 文件配置进行构建,并将生成的二进制文件或库放在 target/debug 目录下。
--release
--release 是一个命令行选项,用于指示 Cargo 在构建过程中使用优化。使用优化可以降低生成的二进制文件或库的大小,提高程序的运行速度,但同时会增加编译时间。默认情况下,cargo build 不使用优化,生成的二进制文件或库针对调试进行了优化。

安装到本地

cargo install --path . 是一个 Cargo 命令,用于在当前目录(. 表示当前目录)安装并生成一个可执行文件或库
使用.表示当前目录。
当你在项目的根目录下运行此命令时,Cargo 会编译并安装该项目。如果项目是一个可执行文件,它会生成一个二进制文件;如果是一个库,它会生成一个库文件。安装完成后,你可以在系统的 PATH 变量中的某个目录找到这个生成的文件,例如在 Unix 系统中的 /usr/local/bin 目录。
需要注意的是,在运行此命令之前,确保已在本地安装了 Cargo 和 Rust。如果尚未安装,请访问 Rust 官方网站 下载并安装。·
然后就可以直接在终端执行我们的命令行工具了fancy

结果展示

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/914473.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Xcode 16 使用 pod 命令报错解决方案

原文请点击这个跳转 一、问题现象&#xff1a; 有人会遇到 Xcode 升级到 16 后&#xff0c;新建应用然后使用 pod init 命令会报错如下&#xff1a; Stack Ruby : ruby 3.3.5 (2024-09-03 revision ef084cc8f4) [x86_64-darwin23]RubyGems : 3.5.22Host : macOS 15.0 (24A335…

Linux 6.13 将提供对一系列 Pre-M1 苹果设备的基本支持

虽然不像苹果 M3/M4 设备支持上游主线 Linux 内核那样令人兴奋&#xff0c;但对于那些拥有一些较旧的苹果&#xff08;M1 之前&#xff09;设备的用户来说&#xff0c;即将发布的 Linux 6.13 内核将支持一些较旧的 SoC 和板卡。 即将到来的 Linux 6.13 合并窗口将支持大量旧版…

【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-最大的数

CL13 最大的数(20 分) 输入一个有 n 个无重复元素的整数数组 a&#xff0c;输出数组中最大的数。提示&#xff1a;如使用排序库函数 sort()&#xff0c;需要包含头文件#include 。输入&#xff1a; 第一行是一个正整数 n(2<n<20)&#xff1b; 第二行包含 n 个不重复的整…

vue elementui el-dropdown-item设置@click无效的解决方案

如图&#xff0c;直接在el-dropdown-item上面设置click&#xff0c;相应的method并没有被触发&#xff0c;查找资料发现需要在它的上级 el-dropdown 处使用 command 方法触发。 【template】 <el-dropdown placement"bottom-end" command"handleCommand&quo…

flinkOnYarn并配置prometheus+grafana监控告警

flinkOnYarn并配置prometheusgrafana监控告警 一、相关服务版本&#xff1a; flink版本&#xff1a;1.17.2 pushgateway版本&#xff1a;1.10.0 prometheus版本&#xff1a;3.0.0 grafana-v11.3.0参考了网上的多个文档以及学习某硅谷的视频&#xff0c;总结了一下文档&#x…

Rocky、Almalinux、CentOS、Ubuntu和Debian系统初始化脚本v9版

Rocky、Almalinux、CentOS、Ubuntu和Debian系统初始化脚本 Shell脚本源码地址&#xff1a; Gitee&#xff1a;https://gitee.com/raymond9/shell Github&#xff1a;https://github.com/raymond999999/shell脚本可以去上面的Gitee或Github代码仓库拉取。 支持的功能和系统&am…

一文1800字使用Jmeter进行http接口性能测试!

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 为什么要做接口测试&#xff1f; 越底层发现b…

当使用key-value方式进行参数传递时,若key对应的是一个对象或数组结构,如何利用API Post工具进行模拟操作。

1. 后端服务代码如下 RequestMapping("/handle11")public Person handle11(Person person){System.out.println(person);return person;} 2. 后端入参结构 person是一个对象&#xff0c;对象结构如下&#xff1a; public class Person {private String username …

Pytorch学习--神经网络--完整的模型验证套路

一、选取的图片 全部代码依托于该博客 二、代码&#xff08;调用训练好的模型&#xff09; import torch import torchvision from PIL import Image from model import *img_path "dog.png" image Image.open(img_path)print(image.size)transform torchvisi…

PMP--一、二、三模--分类--变更

文章目录 技巧考试中的三大项目流程一 、变更流程 高频考点分析&#xff08;一、过程&#xff1b;二、人员&#xff09;一、过程&#xff1a;1.1 变更管理&#xff1a;1.1.1 瀑布型变更&#xff08;一次交付、尽量限制、确定性需求 &#xff1e;风险储备&#xff09;1.1.2 敏捷…

c语言选择排序

选择排序思想&#xff1a; 反复地从未排序部分选择最小&#xff08;或最大&#xff09;的元素&#xff0c;将其放到已排序部分的末尾&#xff1b; 首先用一个变量min来保存数组第一个元素的下标&#xff0c;然后用这个下标访问这个元素&#xff0c;将这个元素与它后面的元素相…

基于SpringBoot的“原创歌曲分享平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“原创歌曲分享平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 平台功能结构图 平台首页界面图 用户注册界面…

JMeter项目实战

目录 一、流程&#xff1a; 1.接口测试流程&#xff1a; 2.测试数据准备&#xff1a; 3.接口功能测试&#xff1a; 4.自动化测试流程&#xff1a; 5.情景压力测试分析&#xff1a; 6.生成图形化测试报告&#xff1a; 一、流程&#xff1a; 1.接口测试流程&#xff1a; …

杨中科 .Net Core 笔记 DI 依赖注入2

ServiceCollection services new ServiceCollection();//定义一个承放服务的集合 services.AddScoped<iGetRole, GetRole>();using (ServiceProvider serviceProvider services.BuildServiceProvider()) {var list serviceProvider.GetServices(typeof(iGetRole));//获…

DAY6 线程

作业1&#xff1a; 多线程实现文件拷贝&#xff0c;线程1拷贝一半&#xff0c;线程2拷贝另一半&#xff0c;主线程回收子线程资源。 代码&#xff1a; #include <myhead.h> sem_t sem1; void *copy1()//子线程1函数 拷贝前一半内容 {int fd1open("./1.txt",O…

Window.history API学习笔记

Window.history API学习笔记 在现代前端开发中&#xff0c;单页应用&#xff08;SPA&#xff09;的流行让我们对于页面的浏览历史管理需求愈加明显。window.history API作为浏览器提供的原生API&#xff0c;能够帮助开发者更加细致地控制用户的导航体验。本文将介绍window.his…

Hbase集群搭建

1. 环境 三台节点hadoop 集群zookeeper 集群hbase 1.1环境准备 使用前文hdfs三台节点 1.11 zookeeper搭建 下载 wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz解压 tar -zxvf apache-zookeeper-3.8.4-bin.tar.gz zookee…

物联网(RFID)全景:被装信息化监控应用与挑战

一、被装物联网信息化建设的动因 信息化改革在20世纪80年代中期启航&#xff0c;旨在提升被装保障的效率。随着时间的推移&#xff0c;硬件的广泛运用和软件的快速迭代&#xff0c;装备业务在规划、制造、分发以及战时支援等核心环节&#xff0c;已经与信息系统深度融合&#x…

2024 年 10 月公链行业研报:比特币引领市场,Layer 2 竞争加剧

作者&#xff1a;Stella L (stellafootprint.network) 数据来源&#xff1a;Footprint Analytics 公链研究页面 在中本聪于 2008 年 10 月 31 日发布比特币白皮书整整 16 年后&#xff0c;比特币再次展现了其对金融世界的革命性影响。2024 年 10 月&#xff0c;在机构投资者…

NCC前端调用查询弹框

系统自带的查询模板 弹框 调启使用默认的 查询模板 是在 单据模板的 列表模板中&#xff0c;有个查询区域 &#xff0c;查询区域就是查询模板内容如果在列表页做客开 新增按钮 调启查询模板 无问题&#xff0c;但是目前需求是需要再卡片页面下调启系统标准的调启模板代码 //调…