rust rewrite of lolcat (kinda)

https://codeberg.org/baer/rollcat

Install

git clone https://codeberg.org/baer/rollcat.git && cd rollcat && cargo build --release && sudo mv target/release/rollcat /usr/bin/ && cd .. && rm -rf rollcat && echo "Done! <3" | rollcat -f 2

Code

// Licensed under the EUPL

// Copyright (c) 2023 Lovis Rentsch

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

use colored::*;
use std::io::{self, BufRead};
use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();
    if args.len() > 1 {
        let q = &args[1];
        match q.as_str() {
            "-f" | "-i" => {
                normal();
            },
            "-v" => rollcat(String::from("Version: 1.0.0 "), 3),
            _ => help(),
        };
    } else {
        normal();
    }
}

fn normal() {
    let stdin = io::stdin();
    let mut counter = 0;
    for l in stdin.lock().lines() {
        counter = counter + 1;
        let line = String::from(l.unwrap());

        rollcat(line, counter);
    }
}

fn rollcat(input: String, line: i32) { 
    let mut ccount = 0;
    let mut frq = 5;
    let mut inv: bool = false;
    let args: Vec<String> = env::args().collect();
    if args.len() > 1 {
        let q = &args[1];
        match q.as_str() {
            "-f" => {
                if args.len() > 2 {
                    match args[2].to_owned().as_str() {
                        "1" => frq = 1,
                        "2" => frq = 5,
                        _ => println!("Error"),
                        
                    }
                }
            },
            "-i" => {
                inv = true;
            }
            _ => {}
        };
    }
    let mut cleaned_input = String::new();
    let mut in_escape_sequence = false;
    for c in input.chars() {
        if c == '\x1B' {
            in_escape_sequence = true;
        } else if in_escape_sequence && c.is_ascii_alphabetic() {
            in_escape_sequence = false;
        } else if !in_escape_sequence {
            cleaned_input.push(c);
        }
    }
    for c in cleaned_input.chars() {
        ccount = ccount + 1;
        let color = color(&ccount, &line, frq);
        if inv {
            print!("{}", c.to_string().on_truecolor(color[0], color[1], color[2]));
        } else {
            print!("{}", c.to_string().truecolor(color[0], color[1], color[2]));
        }
    }
    print!("\n");
}

fn color(num: &i32, line: &i32, frq: i32) -> Vec<u8> {
    let mut color: Vec<u8> = vec![0, 250, 130];
    let mut mode: Vec<&str> = vec![".", ".", "."];
    let factor: u8 = frq as u8;
    let line = line.to_owned();
    let stelle = num.to_owned();
    for _c in 0..stelle + line {
        for i in 0..color.len() {
            if color[i] == 0 {
                mode[i] = "+";
            }

            if color[i] == 255 {
                mode[i] = "-";
            }
        }

        for i in 0..mode.len() {
            if mode[i] == "+" {
                color[i] += factor;
            } else {
                color[i] -= factor;
            }
        }
    }
    color
}

fn help() {
    let info = String::from("This is a simple rewrite of the LOLCAT command in rust");
    rollcat(info, 1);
    rollcat(String::from("  It will read standart input and make it pwetty owo"), 1);
    println!("");
    rollcat(String::from("  -h / --help / * => this help"), 1);
    rollcat(String::from("  -i => make the background colorful, not the text"), 1);
    rollcat(String::from("  -f [1 or 2] => the frequency (1 is slower and 2 faster)"), 1);
    rollcat(String::from("  -v => version"), 1);
    println!("");
    rollcat(String::from("      by Lovis in Rust for fun"), 1);
    rollcat(String::from("      Licensed under EUPL 1.2"), 1);
}