Возможности создания программы командной строки с помощью Rust

С чего начать?

Все, о чем я буду говорить в этом посте, находится в этой ссылке на github, если вы хотите скачать и или следовать через github, не стесняйтесь.

Программы командной строки в Rust могут использовать зависимость под названием clap, ее doc находится здесь. Она может быть использована для проверки данных в командной строке.

Как вы это делаете?

Используя библиотеку clap, как здесь, мы можем получить синтаксический анализатор, который будет выполнять почти все проверки, от типа до порядка. В нашем случае он будет проверять команду, которая представляет собой строку и путь.


#[derive(Parser)]
struct Args {
    command: String,

    #[clap(parse(from_os_str))]
    path: std::path::PathBuf,
}
Войдите в полноэкранный режим Выход из полноэкранного режима

структура, в которой clap выполняет валидацию

Какую программу мы будем выполнять?

Концепции, которые я показываю в этом посте, могут быть использованы для создания практически любой другой программы. Но без лишних слов, мы сделаем компактор (тип zip) и декомпрессор для распаковки файла, который мы запечатали.


fn main() -> std::io::Result<()> {
    let args: Args = Args::parse();

    let mut file_text: String = String::from("");
    let text = std::fs::read_to_string(&args.path).expect("File is wrong");

    if args.command == "zip" {
        zip_file(text, &mut file_text);
    } else if args.command == "unzip" {
        unzip_file(text, &mut file_text);
    }


    let file_path = format!("src/{}.txt", args.command);
    let mut file = File::create(file_path)?;
    file.write_all(&file_text.as_ref())
}

Войдите в полноэкранный режим Выход из полноэкранного режима

Главная функция, где мы выполняем наш код и где происходит большая часть волшебства

Объяснение

В главной функции я начинаю с разбора аргументов в командной строке, после чего создаю изменяемую строку, в которой буду хранить текст из файла, проверяю, существует ли текст в пути, который передал пользователь, наконец, проверяю, какая команда была выполнена, и пишу file_text, который вставляется в файл.

Демонстрация

Для того чтобы было понятно, что было сделано, ниже приводится текст
вход.

Violetas são azuis
Rosas são vermelhas
Meu teclado não está funcionando
Ou será que eu não estou são?

Войдите в полноэкранный режим Выход из полноэкранного режима

основной текст
с помощью команды _ cargo run zip src/text.txt _ с text.txt, являющимся этим текстом, он создаст этот текстовый файл:

Violet5121azuis0Ros5121vermelh50M41teclado1317á1funcionando0Ou1será1que141317612?0
Войдите в полноэкранный режим Выход из полноэкранного режима

Текст на молнии

Эта строка символов — тот же текст, который был передан ранее.

Если мы запустим cargo run unzip src/zip.txt на этом тексте, то он проделает обратный путь и будет таким же, как и текст, который был сделан в начале.

Где же волшебство?

Часть, где можно сказать, что есть магия, находится в функциях zip_file и unzip_file, где, как следует из названия, они застегивают и расстегивают файлы.

fn zip_file(text: String, file_text: &mut String) {
    for line in text.lines() {
        let compact = line
            .replace(" ", "1")
            .replace("são", "2")
            .replace("não", "3")
            .replace("eu", "4")
            .replace("as", "5")
            .replace("ou", "6")
            .replace("est", "7");
        let result = compact + "0";
        file_text.push_str(&*result);
    }
}

fn unzip_file(text: String, file_text: &mut String) {
    for line in text.lines() {
        let compact = line
            .replace("0", "n")
            .replace("1", " ")
            .replace("2", "são")
            .replace("3", "não")
            .replace("4", "eu")
            .replace("5", "as")
            .replace("6", "ou")
            .replace("7", "est");
        file_text.push_str(&*compact);
    }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Функции застегивания и расстегивания

Как вы видите, каждый конкретный символ, например, 3, означающий «нет», заменяет этот текст и создает текст меньшего размера с меньшим количеством повторений, что делает его меньше.

Откуда берутся эти символы?

Символы &* имеют уникальные значения, & означает ссылку на переменную, а * — указатель.

Заключение

Прочитав эту публикацию и разобравшись хотя бы немного в коде Rust, можно сказать, что помимо того, что это чрезвычайно красивый язык, он универсален настолько, что является отличным вариантом для создания программ командной строки. Если вы хотите узнать больше о компрессорах и декомпрессорах, то вот это отличное видео на эту тему ссылка

Оцените статью
devanswers.ru
Добавить комментарий