Software Engineering

The way to do RGB To Hex Conversion in Rust

The way to do RGB To Hex Conversion in Rust
Written by admin


The problem

The rgb perform is incomplete. Full it in order that passing in RGB decimal values will end in a hexadecimal illustration being returned. Legitimate decimal values for RGB are 0 – 255. Any values that fall out of that vary should be rounded to the closest legitimate worth.

Word: Your reply ought to all the time be 6 characters lengthy, the shorthand with 3 won’t work right here.

The next are examples of anticipated output values:

problem.rgb(255, 255, 255) -- returns FFFFFF
problem.rgb(255, 255, 300) -- returns FFFFFF
problem.rgb(0, 0, 0) -- returns 000000
problem.rgb(148, 0, 211) -- returns 9400D3

The answer in Rust

Possibility 1:

fn rgb(r: i32, g: i32, b: i32) -> String {
    format!(
        "{:02X}{:02X}{:02X}",
        r.clamp(0, 255),
        g.clamp(0, 255),
        b.clamp(0, 255)
    ) 
}

Possibility 2:

fn rgb(r: i32, g: i32, b: i32) -> String {
  format!("{0:02X}{1:02X}{2:02X}", r.min(255).max(0), g.min(255).max(0), b.min(255).max(0))
}

Possibility 3:

fn rgb(r: i32, g: i32, b: i32) -> String {
    let r = r.min(255).max(0);
    let g = g.min(255).max(0);
    let b = b.min(255).max(0);
    format!("{:02X}{:02X}{:02X}", r, g, b)
}

Check circumstances to validate our resolution

extern crate rand;
use self::rand::Rng;

fn remedy(r: i32, g: i32, b: i32) -> String {
    let clamp = |x: i32| -> i32 { if x < 0 { 0 } else { if x > 255 { 255 } else { x } } };
    format!("{:02X}{:02X}{:02X}", clamp(r), clamp(g), clamp(b))
}
macro_rules! evaluate {
  ( $acquired : expr, $anticipated : expr ) => {
    if $acquired != $anticipated { panic!("Acquired: {}nExpected: {}n", $acquired, $anticipated); }
  };
}

#[cfg(test)]
mod exams {
    use self::tremendous::*;

    #[test]
    fn basic_tests() {
        evaluate!(rgb(0, 0, 0), "000000");
        evaluate!(rgb(1, 2, 3), "010203");
        evaluate!(rgb(255, 255, 255), "FFFFFF");
        evaluate!(rgb(254, 253, 252), "FEFDFC");
        evaluate!(rgb(-20, 275, 125), "00FF7D");
    }
    
    #[test]
    fn random_tests() {
        for _ in 0..50 {
            let r = rand::thread_rng().gen_range(-32..288);
            let g = rand::thread_rng().gen_range(-32..288);
            let b = rand::thread_rng().gen_range(-32..288);
            evaluate!(rgb(r, g, b), remedy(r, g, b));
        }
    }
}

About the author

admin

Leave a Comment