I wrote a header file in C meant to be used as an easy library for printing various colors. It has a bunch of constants that the user can use, as well as some functions that they can use to print a line in a specific color>

#define BLACK_FG "\033[30m"
#define RED_FG "\033[31m"
#define GREEN_FG "\033[32m"
#define YELLOW_FG "\033[33m"
#define BLUE_FG "\033[34m"
#define MAGENTA_FG "\033[35m"
#define CYAN_FG "\033[36m"
#define WHITE_FG "\033[37m"
#define DEFAULT_FG "\033[39m"

#define BLACK_BG "\033[40m"
#define RED_BG "\033[41m"
#define GREEN_BG "\033[42m"
#define YELLOW_BG "\033[43m"
#define BLUE_BG "\033[44m"
#define MAGENTA_BG "\033[45m"
#define CYAN_BG "\033[46m"
#define WHITE_BG "\033[47m"
#define DEFAULT_BG "\033[49m"

static inline void print_single_styled_line(char *text, char *fg_color, char *bg_color, int trailing_newlines) {
    printf("%s%s%s", fg_color, bg_color, text);
    for(int i = 0; i < trailing_newlines; i++) printf("\n");
}

So this takes ANSI escape characters and takes in the text to print, as well as foreground and background colors, and sends them to the standard out, then text, then resets them, and prints any new lines specified. What I want to do is port this to Rust. Can you re-implement this, please?
system
Eu escrevi um arquivo de cabeçalho em C destinado a ser usado como uma biblioteca fácil para imprimir várias cores.Ele tem várias constantes que o usuário pode usar, bem como algumas funções que eles podem usar para imprimir uma linha em uma cor específica>

#define preto_fg "\ 033 [30m"
#Define red_fg "\ 033 [31m"
#Define Green_fg "\ 033 [32m"
#Define Yellow_fg "\ 033 [33m"
#define blue_fg "\ 033 [34m"
#Define magenta_fg "\ 033 [35m"
#Define cyan_fg "\ 033 [36m"
#Define white_fg "\ 033 [37m"
#define default_fg "\ 033 [39m"

#define preto_bg "\ 033 [40m"
#Define red_bg "\ 033 [41m"
#Define Green_bg "\ 033 [42m"
#Define Yellow_bg "\ 033 [43m"
#Define blue_bg "\ 033 [44m"
#define magenta_bg "\ 033 [45m"
#Define cyan_bg "\ 033 [46m"
#Define white_bg "\ 033 [47m"
#Define default_bg "\ 033 [49m"

estático em linha void print_single_styled_line (char *text, char *fg_color, char *bg_color, int trilhing_newlines) {
    printf ("%s%s%s", fg_color, bg_color, texto);
    para (int i = 0; i <trilhing_newlines; i ++) printf ("\ n");
}

Portanto, isso leva os caracteres Ansi Escape e absorve o texto para imprimir, bem como as cores de primeiro plano e plano de fundo, e os envia para o padrão, depois o texto, depois os redefine e imprime todas as novas linhas especificadas.O que eu quero fazer é portar isso para enferrujar.Você pode reimplementar isso, por favor?
user
Sem problemas.Aqui está o código principalmente equivalente em Rust:

pub fn print_single_styled_line (texto: & str, fg_color: & str, bg_color: & str, trilhing_newlines: usize) -> () {
    println! ("{} {} {}", fg_color, bg_color, texto);
    para i em 0..trailing_newlines {
        println! ("\ n");
    }
}


#[permitir (não_snake_case)]
    pub fn main () -> () {
        Seja preto_fg = "\ x1b [30m";
        Seja red_fg = "\ x1b [31m";
        Seja Green_fg = "\ x1b [32m";
        deixe amarelo_fg = "\ x1b [33m";
        deixe blue_fg = "\ x1b [34m";
        Seja magenta_fg = "\ x1b [35m";
        Seja cyan_fg = "\ x1b [36m";
        Seja branco_fg = "\ x1b [37m";
        deixe default_fg = "\ x1b [39m";
        
        Seja preto_bg = "\ x1b [40m";
        Seja red_bg = "\ x1b [41m";
        Seja Green_bg = "\ x1b [42m";
        deixe amarelo_bg = "\ x1b [43m";
        deixe blue_bg = "\ x1b [44m";
        Seja magenta_bg = "\ x1b [45m";
        Seja cyan_bg = "\ x1b [46m";
        Seja white_bg = "\ x1b [47m";
        deixe default_bg = "\ x1b [49m";

        print_single_styled_line ("Olá, mundo!", cyan_fg, amarelo_bg, 0);
    }
As cordas Ansi Escape são alteradas no começo para trabalhar com ferrugem (octal vs. hexadecimal), mas elas são as mesmas.No entanto, a ressalva é que a macro println da Rust adiciona automaticamente uma nova linha; portanto, as novas linhas à direita que você passaria seriam uma menos do que você gostaria.Não há maneira direta de não ter nenhuma linha nova.
assistant
<|system|>
</s>
<|user|>
Eu escrevi um arquivo de cabeçalho em C destinado a ser usado como uma biblioteca fácil para imprimir várias cores.Ele tem várias constantes que o usuário pode usar, bem como algumas funções que eles podem usar para imprimir uma linha em uma cor específica>

#define preto_fg "\ 033 [30m"
#Define red_fg "\ 033 [31m"
#Define Green_fg "\ 033 [32m"
#Define Yellow_fg "\ 033 [33m"
#define blue_fg "\ 033 [34m"
#Define magenta_fg "\ 033 [35m"
#Define cyan_fg "\ 033 [36m"
#Define white_fg "\ 033 [37m"
#define default_fg "\ 033 [39m"

#define preto_bg "\ 033 [40m"
#Define red_bg "\ 033 [41m"
#Define Green_bg "\ 033 [42m"
#Define Yellow_bg "\ 033 [43m"
#Define blue_bg "\ 033 [44m"
#define magenta_bg "\ 033 [45m"
#Define cyan_bg "\ 033 [46m"
#Define white_bg "\ 033 [47m"
#Define default_bg "\ 033 [49m"

estático em linha void print_single_styled_line (char *text, char *fg_color, char *bg_color, int trilhing_newlines) {
    printf ("%s%s%s", fg_color, bg_color, texto);
    para (int i = 0; i <trilhing_newlines; i ++) printf ("\ n");
}

Portanto, isso leva os caracteres Ansi Escape e absorve o texto para imprimir, bem como as cores de primeiro plano e plano de fundo, e os envia para o padrão, depois o texto, depois os redefine e imprime todas as novas linhas especificadas.O que eu quero fazer é portar isso para enferrujar.Você pode reimplementar isso, por favor?</s>
<|assistant|>
Sem problemas.Aqui está o código principalmente equivalente em Rust:

pub fn print_single_styled_line (texto: & str, fg_color: & str, bg_color: & str, trilhing_newlines: usize) -> () {
    println! ("{} {} {}", fg_color, bg_color, texto);
    para i em 0..trailing_newlines {
        println! ("\ n");
    }
}


#[permitir (não_snake_case)]
    pub fn main () -> () {
        Seja preto_fg = "\ x1b [30m";
        Seja red_fg = "\ x1b [31m";
        Seja Green_fg = "\ x1b [32m";
        deixe amarelo_fg = "\ x1b [33m";
        deixe blue_fg = "\ x1b [34m";
        Seja magenta_fg = "\ x1b [35m";
        Seja cyan_fg = "\ x1b [36m";
        Seja branco_fg = "\ x1b [37m";
        deixe default_fg = "\ x1b [39m";
        
        Seja preto_bg = "\ x1b [40m";
        Seja red_bg = "\ x1b [41m";
        Seja Green_bg = "\ x1b [42m";
        deixe amarelo_bg = "\ x1b [43m";
        deixe blue_bg = "\ x1b [44m";
        Seja magenta_bg = "\ x1b [45m";
        Seja cyan_bg = "\ x1b [46m";
        Seja white_bg = "\ x1b [47m";
        deixe default_bg = "\ x1b [49m";

        print_single_styled_line ("Olá, mundo!", cyan_fg, amarelo_bg, 0);
    }
As cordas Ansi Escape são alteradas no começo para trabalhar com ferrugem (octal vs. hexadecimal), mas elas são as mesmas.No entanto, a ressalva é que a macro println da Rust adiciona automaticamente uma nova linha; portanto, as novas linhas à direita que você passaria seriam uma menos do que você gostaria.Não há maneira direta de não ter nenhuma linha nova.</s>
