Tuesday, June 6, 2023
HomeSoftware EngineeringEasy methods to do RGB To Hex Conversion in Rust

Easy methods to do RGB To Hex Conversion in Rust


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 at all times 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

Choice 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)
    ) 
}

Choice 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))
}

Choice 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)
}

Take a look at circumstances to validate our resolution

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

fn resolve(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! examine {
  ( $bought : expr, $anticipated : expr ) => {
    if $bought != $anticipated { panic!("Obtained: {}nExpected: {}n", $bought, $anticipated); }
  };
}

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

    #[test]
    fn basic_tests() {
        examine!(rgb(0, 0, 0), "000000");
        examine!(rgb(1, 2, 3), "010203");
        examine!(rgb(255, 255, 255), "FFFFFF");
        examine!(rgb(254, 253, 252), "FEFDFC");
        examine!(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);
            examine!(rgb(r, g, b), resolve(r, g, b));
        }
    }
}
RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments